对于幂运算来说,就是相同的几个数相乘,改成大数处理问题,同样可以转化成两个大数相乘问题,乘得的积作为一个新数,再用这个新数与另一个作积,这样循环下去即可进行幂运算。
对于两个大数该如何处理;
对于字符串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 ;
}