zoukankan      html  css  js  c++  java
  • 大数处理之二(幂运算)

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

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

    对于字符串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 ;
    }
    
  • 相关阅读:
    git线上操作
    IDEA快捷方式
    Java 四种线程池
    java 获取当前天之后或之前7天日期
    如何理解AWS 网络,如何创建一个多层安全网络架构
    申请 Let's Encrypt 通配符 HTTPS 证书
    GCE 部署 ELK 7.1可视化分析 nginx
    使用 bash 脚本把 AWS EC2 数据备份到 S3
    使用 bash 脚本把 GCE 的数据备份到 GCS
    nginx 配置 https 并强制跳转(lnmp一键安装包)
  • 原文地址:https://www.cnblogs.com/scottding/p/3662666.html
Copyright © 2011-2022 走看看