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\n");
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\n",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、逆置函数需要自写

时间: 2024-10-08 21:38:42

2981 大整数加法的相关文章

A——大整数加法(HDU1002)

题目: I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B. InputThe first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line co

日常记录(c语言)--字符串实现大整数加法

运行环境:CentOs 64位--vim 最近在看<剑指offer>这本书,看了前面的关于面试的能力,顿时觉得自己的编程能力差得好远. 可能我对鲁棒的代码理解还不深,我觉得鲁棒应该就是代码可以应对各种不同的输入,都能有相应的处理,并给出相应的输出. 下面是我看了之后对之前做过的大整数加法做了一些完善,之前的只能实现对纯数字字符进行求和,甚至连对空指针的处理都没有,好惭愧.我会用注释来记录自己对此算法的理解. 1 #include <stdio.h> 2 #include <s

AC日记——大整数加法 openjudge 1.6 10

10:大整数加法 总时间限制:  1000ms 内存限制:  65536kB 描述 求两个不超过200位的非负整数的和. 输入 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0. 输出 一行,即相加后的结果.结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342. 样例输入 22222222222222222222 33333333333333333333 样例输出 55555555555555555555 来源 程序设计实习2007 思路: 模拟: 来,上代码:

uva 424(Integer Inquiry)高精度大整数加法

这是一道很标准的大整数加法,我却wa了4次,没提交一次就查到一些细节问题,比如说我们考虑前导 0的问题,还有就是没有对输入数组处理, 使得他们每次输入时高位的置0,还有就是没考虑到最后相加后的进位, 这些问题一一改正之后,还是wa了,原来是因为,我把if语句中的==只写了一个...真坑啊,,,我就说怎么会 不过,明明写的对的,大数相加竟然还wa了四次,还有就是这道题最后不写换行也会wa...看来还是有必要从基础练起提高代码能力: 贴代码: #include<stdio.h> #include&

单链表大整数加法

单链表大整数加法,节点是char型. First     List:   head->1->8->9 Second List:   head->9->8->1 Result  List:    head->1->1->7->0 实现了单链表(单链表类模板),现在使用单链表实现大整数加法 1 #include "stdafx.h" 2 #include "SingleList.h" 3 #include &l

POJ 2506 Tiling(递推+大整数加法)

http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 7 int n; 8 char s[255][255]; 9 10

HDU - 1002 A + B Problem II (大整数加法)

一道很基础的大整数加法. 简单的说一下思路吧. 先用字符串读取两个大数.首先需要把数组给初始化为0方便以后处理,然后对数组逆序对齐处理,接着相加转化后的两个数组并把之存进结果数组里面,最后对结果数组进行进位处理. 看代码吧. #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <queue> #include <stac

高精度计算(一):大整数加法

C/C++中的int 类型能表示的范围是-231~231 – 1.unsigned 类型能表示的范围是 0 ~232 – 1,即 0~4294967295.所以,int 和unsigned 类型变量,都不能保存超过10 位的整数.有时我们需要参与运算的数,可能会远远不止10 位,例如要求100!的精确值.即便使用能表示的很大数值范围的double 变量,但是由于double变量只有64 位,double 变量的精度也不足以表示一个超过100 位的整数.一般我们称这种基本数据类型无法表示的整数为大

大整数加法计算

普通数字的运算,我们可以直接运用已有类型int, long, long long等等计算,但要是数字非常大,这些类型是远远装不下的. 故而很多情况下需要我们自己来设置大整数运算,本篇记录的是大整数的加法运算的方法. 对于加法运算,第一个方法是模拟手算.先来看看手算的步骤: 手算的时候,我们会先把个位相加,有进位则向前进一位,然后计算下一位,重复此步骤.若两个数的位数不同,计算时我们会把位数长的放在上面,位数短的放在下面.短位的数加完后,长位的数则和0相加. 实现加法计算的思路很简单,首先把数字都