我是靠谱客的博主 彩色手套,这篇文章主要介绍十进制大数的加法运算,现在分享给大家,希望可以做个参考。

输入:输入的第一行为一个整数N,表示有N组数据。每组数据最多包含100行。每行由一个非常长的十进制整数组成,该整数的长度不会超过100个字符而且只包含数字,每组的数据的最后一行为0,表示这组数据结束。每组数据之间有一个空行。

输出:对于输入的每组数据,输出它们的和。每两组数据的输入之间有一个空行。


分析:

本题对每一位进行求和的时候,可以采用字符形式,也可以采用整数形式。

但是根据经验......用整数处理起来更方便哦。

需要注意以下两点:

1、每一位计算和的时候,得到的进位可能大于1。

2、累加各大数得到的和,其位数可能会比参与运算的大数的位数还要多。

因为参加求和运算的大数的个数不会超过100个,因此如果参与求和运算的大数的最大长度为maxlen,那么求和结果长度不会超过maxlen+2。那么求和的时候只需要一直求和到maxlen+2位,然后去掉后面的0,再以相反的顺序输出各位整数就行啦。


代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int main(){ char buffer[200];//以字符形式存储读入的每一个整数 int array[200][200];//逆序后的大数以及求得的和 int answer[200]; int i,j,k; int num_integers;//读入的整数的个数 int len,maxlen;//每个整数的长度以及这些整数的最大长度 int sum,carry,digit;//每位求和运算后得到的总和、进位以及该位的结果 int N; scanf("%d", &N); for(k = 1; k <= N; k++) { maxlen = -1; memset(array, 0, sizeof(array)); memset(answer, 0, sizeof(answer)); for(num_integers = 0; num_integers < 200; num_integers++) { gets(buffer); if(strcmp(buffer, "0") == 0) break; len = strlen(buffer); if(len > maxlen) maxlen = len; for(i = 0; i < len; i++) { array[num_integers][i] = buffer[len - 1 - i] - '0';//逆序存放大数的每位(整数形式) } } carry = 0; for(i = 0; i < maxlen + 2; i++) { sum = carry; for(j = 0; j < num_integers; j++) sum += array[j][i]; digit = sum % 10; carry = sum / 10; answer[i] = digit; } for(i = maxlen + 2; i >= 0; i--) { if(answer[i] != 0) break; } while(i >= 0) printf("%d",answer[i--]); printf("n"); if(k < N) printf("n"); } return 0; }


最后

以上就是彩色手套最近收集整理的关于十进制大数的加法运算的全部内容,更多相关十进制大数内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部