• 2981 大整数加法


    题目来源:
    http://bailian.openjudge.cn/practice/2981/
    描述
    求两个不超过200位的非负整数的和。
    输入
    有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。
    输出
    一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
    样例输入
    22222222222222222222
    33333333333333333333
    样例输出
    55555555555555555555
    题意描述:
    输入两行都不超过200位的非负整数
    计算并输出相加后的结果(去除前导零)
    解题思路:
    先将str1和str2都逆置(自定义逆置函数或者逆序存储)
    取两者较长位数的长度,将短数补齐
    一一对应计算
    最后去除结果的前导零输出即可
    程序代码:

     1 #include<stdio.h>
     2 const int N=230;
     3 #include<string.h>
     4 void strr(char *str); 
     5 int main()
     6 {
     7     char str1[N],str2[N];
     8     int  sum[N],l1,l2,l,i,j;
     9     while(scanf("%s%s",str1,str2)!=EOF)
    10     {
    11         strr(str1);      
    12         strr(str2);
    13         l1=strlen(str1); 
    14         l2=strlen(str2);
    15         if(l1>=l2) 
    16         {
    17             l=l1;
    18             for(i=l2;i<l;i++)
    19                 str2[i]='0';
    20         }
    21         else
    22         {
    23             l=l2;
    24             for(i=l1;i<l;i++)
    25                 str1[i]='0';
    26         }        
    27         if(l==1 && str1[0]=='0' && str2[0]=='0')
    28         {
    29             printf("0
    ");
    30             continue;
    31         }
    32         
    33         memset(sum,0,sizeof(sum));
    34         for(i=0;i<l;i++)
    35         {
    36             sum[i] += str1[i]-'0'+str2[i]-'0';//一一对应-'0' 
    37             if(sum[i] > 9)
    38             {
    39                 sum[i] %= 10;
    40                 sum[i+1]++;//进位 
    41             }
    42         }
    43         
    44         for(j=i;j>=0;j--)
    45             if(sum[j] > 0)//去掉前导零 
    46             break;
    47           for(i=j;i>=1;i--) 
    48               printf("%d",sum[i]);
    49         printf("%d
    ",sum[i]);
    50      } 
    51     return 0;
    52 }
    53 void strr(char *str)
    54 {
    55     int i,l,t;
    56     l=strlen(str);
    57     for(i=0;i<l/2;i++){
    58         t=str[i];
    59         str[i]=str[(l-1)-i];
    60         str[(l-1)-i]=t;
    61     }
    62 }

    易错分析:
    1、注意0 + 0 的情况,判断时与字符‘0’比较而不是0
    2、逆置函数需要自写

  • 相关阅读:
    Contains Duplicate III
    Contains Duplicate
    bitmap
    机器人的运动范围
    矩阵中的路径
    不要62
    牛顿迭代法求方程的根
    统计C语言合法字符
    迭代法求平方根
    欧几里德算法(求两个正整数的最大公约数)
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/6883494.html
Copyright © 2020-2023  润新知