对于幂运算来说,就是相同的几个数相乘,改成大数处理问题,同样可以转化成两个大数相乘问题,乘得的积作为一个新数,再用这个新数与另一个作积,这样循环下去即可进行幂运算。
对于两个大数该如何处理;
对于字符串s1[100] 中存放第一个大数, s2[100]中存放第二个大数;
定义两个整型数组 a[100] , b[100] ;
使得字符串s1和s2能够像列竖式一样右对齐,并分别存入 a 和 b 中 。
然后进行双重循环,使得其中也个数组中的每一个数值都与另一个数组相乘,对应的数值加到一个新数组sum中;
然后处理数组sum,如果sum数组中有数值超过十的,向前进一位,对这个数取余后的结果重新存入数组sum中;
这样就实现了两个大数相乘,结果存在一个新的数组中,在以这个数组作为一个新数,与另一个相乘;
详细代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 |
#include<iostream> #include<stdio.h> #include<string> #include<string.h> using
namespace std ; int main() { char
R[10] ; int
n ; while ( scanf ( "%s%d" ,R,&n) != EOF) { int
sum[205] = {0} ; int
a[6] = {0} ; int
t = 0 ; int
len = strlen (R) ; for ( int
i = len - 1 , p = 4 ; i >= 0 ; i--) { if (R[i] != ‘.‘ ) a[p--] = R[i] - ‘0‘
; else t = i + 1 ; } t = 6 - t ; t = t * n ; int
j , k , kk , jj; for (j = 4 ; j >= 0 ; j--) for (k = 4 , kk = 200 - (4 - j) ; k >= 0 ; k--) sum[kk--] += ((a[j]) * (a[k])) ; for (jj = 200 ; jj >= 1 ; jj--) { sum[jj-1] += sum[jj] / 10 ; sum[jj] = sum[jj] % 10 ; } n-- ; n-- ; while (n--) { int
sum1[205] = {0} ; for (j = 4 ; j >= 0 ; j--) for (k = 200 , kk = 200 - (4 - j) ; kk >= 0 && k > 0 ;k--) sum1[kk--] += ((a[j]) * (sum[k])) ; for (jj = 200 ; jj >= 1 ; jj--) { sum1[jj-1] += sum1[jj] / 10 ; sum1[jj] = sum1[jj] % 10 ; } for ( int
ii = 0 ; ii <= 200 ; ii++) sum[ii] = sum1[ii] ; } int
start = 0 ; int
end = 200 ; while (!sum[end]) end-- ; while (start <= 199 && !sum[start]) { if (start == 200 - t + 1) break
; start++ ; } bool
flag = true
; if (200 - t + 1 == start ) { cout << ".0"
; start++ ; flag = false
; } if (!flag) { while (start <= end) printf ( "%d" ,sum[start++]) ; } else
{ while (start <= end ) { if (start == 200 - t + 1) printf ( "." ); printf ( "%d" ,sum[start++]) ; } } printf ( "\n" ) ; } return
0 ; } |
原文:http://www.cnblogs.com/scottding/p/3662666.html