zoukankan      html  css  js  c++  java
  • 关于大数的运算,高精度运算

    N的阶乘

    问题描述
      输入一个正整数n,输出n!的值。
      其中n!=1*2*3*…*n。
    算法描述
      n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
      将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
      首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。
    输入格式
      输入包含一个正整数n,n<=1000。
    输出格式
      输出n!的准确值。
    样例输入
    10
    样例输出
    3628800

    代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #define MAX 4000
     4 int main() 
     5 {
     6     int n,a[MAX],i,g,s,t=0;
     7     scanf("%d",&n);
     8     memset(a,0,sizeof(a));
     9     a[0]=1;
    10     for(i=2;i<=n;i++)
    11     {
    12         for(g=0;g<MAX;g++)
    13         {
    14             s=a[g]*i+t;
    15             t=s/10;//进位
    16             a[g]=s%10;
    17         }
    18     }
    19     for(i=MAX-1;i>=0;i--)//计算位数 
    20     {
    21         if(a[i])
    22             break;
    23     }
    24     for(g=i;g>=0;g--)//倒序输出
    25         printf("%d",a[g]);
    26     return 0;
    27 }

    BASIC-29 高精度加法

    问题描述
      输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
    算法描述
      由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
      定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
      计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
      最后将C输出即可。
    输入格式
      输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
    输出格式
      输出一行,表示a + b的值。
    样例输入
    20100122201001221234567890
    2010012220100122
    样例输出
    20100122203011233454668012

    代码如下:

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4  int main()
     5  {
     6      char a[100];
     7      char b[100];
     8      int c[100];
     9      gets(a);
    10      gets(b);
    11      memset(c,0,sizeof(c));
    12      int len1=strlen(a)-1;
    13      int len2=strlen(b)-1;
    14      int i=0;
    15      while(i<=len1||i<=len2)
    16      {
    17          if(i<=len1)
    18          {
    19              c[i]=c[i]+a[len1-i]-'0';
    20         }
    21         if(i<=len2)
    22         {
    23             c[i]=c[i]+b[len2-i]-'0';
    24         }
    25         if(c[i]>=10)
    26         {
    27             c[i+1]=c[i]/10;
    28             c[i]%=10;
    29         }
    30         i++;
    31         if(i>len1&&i>len2&&c[i])
    32         {
    33             i++;
    34         }
    35     }
    36     int g;
    37     for(g=i-1;g>=0;g--)
    38     {
    39         printf("%d",c[g]);
    40     }
    41     printf("
    ");
    42     return 0;
    43  }

    阶乘之和

    链接:https://ac.nowcoder.com/acm/contest/1069/C

    题目描述

    用高精度计算出S=1!+2!+3!+…+n!(n ≤ 50)其中“!”表示阶乘,例如:5!=5*4*3*2*1。

    输入描述:

    输入正整数N

    输出描述:

    输出计算结果S

    输入

     3

    输出

     9

    代码

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <iostream>
     4 #include <string>
     5 #include <math.h>
     6 #include <algorithm>
     7 #include <queue>
     8 #include <set>
     9 const int INF=0x3f3f3f3f;
    10 using namespace std;
    11 int S[1010];
    12 int cnt_s;
    13 int T[1010];
    14 int cnt_t;
    15 
    16 void f1(int x)
    17 {
    18     int jw=0;
    19     for(int i=0;i<cnt_t;i++)
    20     {
    21         jw+=T[i]*x;
    22         T[i]=jw%10;
    23         jw/=10;
    24     }
    25     while(jw)
    26     {
    27         T[cnt_t++]=jw%10;
    28         jw/=10;
    29     }
    30 }
    31 
    32 void f2()
    33 {
    34     for(int i=0;i<cnt_t;i++)
    35     {
    36         S[i]+=T[i];
    37         if(S[i]>9)
    38         {
    39             S[i+1]+=S[i]/10;
    40             S[i]%=10;
    41         }
    42     }
    43     cnt_s=cnt_t;//阶乘n位数一定大于阶乘1到n-1的和,小位数加大位数,偷懒了
    44 }
    45 
    46 int main()
    47 {
    48     int n;
    49     scanf("%d",&n);
    50     cnt_t=1;
    51     T[0]=1;
    52     for(int i=1;i<=n;i++)
    53     {
    54         f1(i);
    55         f2();
    56     }
    57     for(int i=cnt_s-1;i>=0;i--)
    58     {
    59         printf("%d",S[i]);
    60     }
    61     printf("
    ");
    62     return 0;
    63 }
  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/jiamian/p/10322443.html
Copyright © 2011-2022 走看看