百练

xiaoxiao2021-02-28  117

描述

求两个大的正整数相减的差。

输入 共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。 输出 一行,即所求的差。 样例输入 9999999999999999999999999999999999999 9999999999999

样例输出

9999999999999999999999990000000000000

 C语言中最大的整型数据类型是long类型,占4个字节  C中短整型和整型均占2个字节,取值范围是 -32768 ~~~ 32767  长整型占4个字节,取值范围是 -2147483648 ~~~~ 2147483647  如果是无符号数的话,可以表示的数据就是  短整型和 整型:  0--- 65535  长整型:             0---4294967295              当数据超过能长整型所能表示的范围以后,如果继续做加减会使得到的结果出错,所以这时候我们就需要用到数组来存储位数,用最简单的位数相加来对大数的各个位数做加法运算   思路:先用两个char类型的字符串类型来存储大数各个位数,因为char字符型不方便做加法位运算,所以接下来就把char类型数组转换为int类型数组,在int类型上数组做减法位运算,然后把int类型数组上的各个数打印出来就是最后的结果 例如题目所示                          9999999999999999999999999999999999999                      -  0000000000000000000000009999999999999                 -----------------------------------------------------------------------                          9999999999999999999999990000000000000 当位数出现进位情况也类似,我们只需要对相同位数上的数进行位运算就可以了

#include<stdio.h> #include<string.h> int main() { int i,j,str1,str2,k=0; int a1[255],a2[255],a3[255]; char c1[255],c2[255]; //用字符方式存储两个大数的数值 for(i=0;i<255;i++) { a1[i]=0; //把int数组内所有数内置为0 a2[i]=0; } scanf("%s",c1); scanf("%s",c2); //用char类型c1,c2存储大数的值 str1=strlen(c1); //用str1表示读入第一个数的长度 str2=strlen(c2); j=0; for(i=str1-1;i>=0;i--) //将大数c1从char类型转化为int类型当中 a1[j++]=c1[i]-'0'; j=0; for(i=str2-1;i>=0;i--) //将大数c2从char类型转化为int类型当中 a2[j++]=c2[i]-'0'; for(i=0;i<255;i++) { a1[i]-=a2[i]; if(a1[i]<0) //出现需要向前一位数借1的情况 { a1[i]+=10; //相同位作减法,前减位数小于后减位数向前借"1" a1[i+1]--; } } j=0; //例如a1相减后的结果是1234 for(i=254;i>=0;i--) //a1表示就是1234000...000 a3[j++]=a1[i]; //a3变化后为000...0001234 //下边目的就是想办法把这些前置的0给消除 for(i=0;i<255;i++) { if(a3[i]!=0) k=1; //当从第一位数一直到非0的数我们都不需要打印 if(k==1) printf("%d",a3[i]);]);//当第一位非0的数出现时候我们把剩下的数打印出来 } if(k==0) printf("0"); //避免出现两个数相同捡的为0无输出的情况 printf("\n"); return 0; }

转载请注明原文地址: https://www.6miu.com/read-74988.html

最新回复(0)