百练_2736大整数减法(大数相减)

来源:互联网 发布:淘宝网虚假交易处罚 编辑:程序博客网 时间:2024/05/16 09:26
描述

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

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

样例输出

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;}