• 大数处理之二(幂运算)


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

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

    对于字符串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("
    ") ;
            }
            return 0 ;
    }
    
  • 相关阅读:
    FFOM_秒交易行
    FFOM_脚本源代码
    农药_挂周金币
    保存数据,父页面列表数据更新
    点击按钮不弹出新窗口
    GridView1_RowDeleting 弹出确认对话框
    判断复选框
    获取Guid
    2019 gplt团体程序设计天梯赛总结
    Codeforces Round #550 (Div. 3)E. Median String
  • 原文地址:https://www.cnblogs.com/NYNU-ACM/p/4237442.html
Copyright © 2020-2023  润新知