大数处理之二(幂运算)
对于幂运算来说,就是相同的几个数相乘,改成大数处理问题,同样可以转化成两个大数相乘问题,乘得的积作为一个新数,再用这个新数与另一个作积,这样循环下去即可进行幂运算。
对于两个大数该如何处理;
对于字符串s1[100] 中存放第一个大数, s2[100]中存放第二个大数;
定义两个整型数组 a[100] , b[100] ;
使得字符串s1和s2能够像列竖式一样右对齐,并分别存入 a 和 b 中 。
然后进行双重循环,使得其中也个数组中的每一个数值都与另一个数组相乘,对应的数值加到一个新数组sum中;
然后处理数组sum,如果sum数组中有数值超过十的,向前进一位,对这个数取余后的结果重新存入数组sum中;
这样就实现了两个大数相乘,结果存在一个新的数组中,在以这个数组作为一个新数,与另一个相乘;
详细代码如下:
#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 ; }