• 大数连乘解决若干数学问题


    一.问题描述  

      n!或者c(n,m)=n*……(n-m+1)/n!或者p(n,m)= n*……(n-m+1),这些问题全都可通过连乘解决。

    二.注意事项:

      小数的组合数可以通过刘汝佳那种方式(ans=ans*b/a),通过10^num = n!判断(log10(n!))出阶乘的位数(num+1);

      在阶乘中若是每个数组元素上存储多位(此时需要注意中间结果溢出问题),则输出需要printf("%5d")。

      阶乘中间结果是否会溢出:比如2000的阶乘,就这“a[k] = a[k]*j + w”可能溢出;按存储一个数字分析,a[k]最大9,j最大1999,w最大是9,不会溢出。

    三.程序代码

      

     1 void liancheng(int m,int n)//n>m,由用户保证 
     2 {
     3     memset(a,0,sizeof(a));
     4     int temp = n;
     5    //先把数字m拆分进数组a,低位在小下标
     6    int i = 0;//最终结果位数  
     7     while(temp>0)
     8     {
     9         a[i++] = temp%10;
    10         temp/=10;
    11     }
    12     
    13     for(int j=n-1; j>=m;j++)
    14     {
    15         int w = 0;//进位 
    16         for(k=0; k<i; k++)
    17         {
    18             a[k] = a[k]*j + w;
    19             w = a[k]/10;
    20             a[k]%=10;
    21         }
    22         //扩展结果位数 
    23         while(w>0)
    24         {
    25             i++;
    26             a[i] = w%10;
    27             w /= 10;
    28         }
    29     }  
    30 }
     1 //下面结果连乘除以n!问题
     2 memset(b,0,sizeof(b));
     3 for(int t=2; t<=n; t++)
     4 {
     5     int s = 0;//s是余数
     6     //下面的for循环每次完成除一个数的任务  
     7     for(int p=i; p>=0; p--)//从最高位开始
     8     {
     9         s = s*10 + a[p];//不是 a[p] = a[p]*10 + s;
    10         b[p] = s/t;//商 ,b的下标没必要单独开 
    11         s %= t;
    12     } 
    13     
    14     //一定在除数的 大循环体内 ,小循环外 
    15     while(b[i]==0)//写成 while(b[i]) 意思就完全不同了 
    16         i--;//下次被除数从哪一位开始除
    17     
    18     //数组b的前i位都是 商,不包括前导0
    19     //因为是连除,下面的产生新的被除数 送入a数组 
    20     for(int r=0; r<i; r++)//大循环体内 
    21         a[r] = b[r]; 
    22 } 
    1 //输出结果
    2 for(int q=i; q>=0; q--)
    3     cout<<a[q]; 


    四.结束语

      由于本人水平有限,疏漏之处在所难免,还望大牛不吝赐教……HPU张朋飞拜上(QQ:791909235)    

  • 相关阅读:
    Xcode fold code All In One
    Xcode iOS project rename All In One
    SwiftUI App Sticker All in One
    hash算法
    TCP
    gRPC目录
    Go客户端流式gRPC
    服务端流式RPC
    protobuf简单使用
    protobuf安装
  • 原文地址:https://www.cnblogs.com/hxsyl/p/2965793.html
Copyright © 2020-2023  润新知