大数处理之二(幂运算)

对于幂运算来说,就是相同的几个数相乘,改成大数处理问题,同样可以转化成两个大数相乘问题,乘得的积作为一个新数,再用这个新数与另一个作积,这样循环下去即可进行幂运算。

对于两个大数该如何处理;

对于字符串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 ;
}

 

 

posted @ 2014-04-13 20:13  NYNU_ACM  阅读(168)  评论(0编辑  收藏  举报