[关闭]
@P2Oileen 2019-08-02T05:43:21.000000Z 字数 1465 阅读 928

高精度


高精度加法

由于数字中间没有空格,长度未知,所以读入方式选择字符串读入

  1. char ch1[105];
  2. char ch2[105];
  3. scanf("%s",ch1);
  4. scanf("%s",ch2);
  5. int len1=strlen(ch1);
  6. int len2=strlen(ch2);

为了模拟人类纸面运算,我们将数组反序,注意ascii码与正常数字的区别

  1. for(int i=0;i<len1;i++) a[i]=ch1[len1-i-1]-'0';
  2. for(int i=0;i<len2;i++) b[i]=ch2[len2-i-1]-'0';

加法的实现以及进位

  1. int maxlen=max(len1,len2);
  2. int x;
  3. for(int i=0;i<maxlen;i++)
  4. {
  5. c[i]=b[i]+a[i];
  6. x=c[i] / 10;//进位
  7. b[i+1]+=x;//加到哪里都可以
  8. c[i] %= 10; //只保留个位数
  9. }
  10. c[maxlen]=x;

删除前导0

  1. while(c[maxlen]==0 && maxlen>=0) maxlen--;

排除0+0的情况,并输出结果

  1. if(maxlen==-1)
  2. {
  3. printf("0");
  4. return 0;
  5. }
  6. for(int i=maxlen;i>=0;i--) printf("%d",c[i]);

高精度比较大小

如果长度不同,长度长的那个数更大
如果长度相同,直接比较字典序

  1. if(len1>len2) printf("A>B");
  2. else if(len2 > len1) printf("B>A");
  3. else if(len1==len2)
  4. {
  5. if(strcmp(ch1,ch2)==1) printf("A>B");
  6. else if(strcmp(ch1,ch2)==0) printf("A=B");
  7. else printf("A<B");
  8. }

高精度乘法

规则基本相同,进位处理不同。
读入并初始化

  1. scanf("%s%d",ch1,&b);
  2. int len1=strlen(ch1);
  3. for(int i=0;i<len1;i++) a[i]=ch1[len1-i-1]-'0';

计算并进位

  1. int x=0;
  2. for(int i=0;i<len1;i++)
  3. {
  4. c[i]=a[i]*b+x;
  5. x=c[i] / 10;
  6. c[i] %= 10;
  7. }
  8. while(x!=0)
  9. {
  10. c[len1]=x % 10;
  11. x/=10;
  12. len1++;
  13. }

去除前导零并排除特殊情况

  1. while(c[len1]==0 && len1>=0) len1--;
  2. if(len1==-1)
  3. {
  4. printf("0");
  5. return 0;
  6. }

输出

  1. for(int i=len1;i>=0;i--) printf("%d",c[i]);
  1. //openjudge 1.6-14
  2. #include <cstdio>
  3. #include <iostream>
  4. #include <cstring>
  5. using namespace std;
  6. int a[1000005],c[1000005];
  7. int main()
  8. {
  9. a[0]=1;
  10. c[0]=a[0];
  11. int len1=0;
  12. int n,x;
  13. scanf("%d",&n);
  14. for(int j=1;j<=n;j++)
  15. {
  16. x=0;
  17. for(int i=0;i<=len1;i++)
  18. {
  19. c[i]=a[i]*j+x;
  20. x=c[i] / 10;
  21. c[i] %= 10;
  22. }
  23. while(x!=0)
  24. {
  25. len1++;
  26. c[len1]=x % 10;
  27. x/=10;
  28. }
  29. for(int i=0;i<=len1;i++) a[i]=c[i];
  30. }
  31. for(int i=len1;i>=0;i--) printf("%d",c[i]);
  32. return 0;
  33. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注