**问题描述:**对您来说,我有一个非常简单的问题。给定两个整数A和B,您的工作是计算A + B的总和。
输入 输入的第一行包含一个整数T(1 <= T <= 20),它表示测试用例的数量。然后是T行,每行由两个正整数A和B组成。请注意,这些整数非常大,这意味着您不应使用32位整数对其进行处理。您可以假设每个整数的长度不超过1000。
**输出:**对于每个测试用例,您应该输出两行。第一行是“ Case#:”,#表示测试用例的编号。第二行是等式“ A + B = Sum”,Sum表示A + B的结果。请注意,该等式中有一些空格。在两个测试用例之间输出空白行。
样本输入
2
1 2
112233445566778899 998877665544332211
样本输出
Case :1:
1 + 2 = 3
Case :2:
112233445566778899 + 998877665544332211 = 1111111111111111110
**分析:**此题涉及到了大数问题:
何为大数问题?这就要说到C语言中各个数据类型的储存大小了:
char :1个字节 (8位)
char*(即指针变量): 8个字节 (64位)
short int : 2个字节 (16位)
int: 4个字节 (32位)
unsigned int : 4个字节 (32位)
float: 4个字节 (32位)
double: 8个字节 (64位)
long: 8个字节 (64位)
long long: 8个字节 (64位)
unsigned long: 8个字节 (64位)
以上位64位计算机中所占大小,其他自行查阅。
可见对于普通数据类型,一个数最多64bit,所以对于1000位的数据,普通数据类型是无法使用的,所以对于大数一般常用的就是用字符串的形式存储,逐个拆分进行处理。
此题没有什么算法上的难度,比解细节的就是,对于数组的边界问题要格外注意!
#include<stdio.h>
#include<string.h>
int toint(char ch);
int main() {
char A[1001],B[1001];
int Alength,Blength,num[1001];
int i,j=1,k;
int n;
scanf("%d",&n);
while(n--) {
if(j!=1) {
printf("\n");
for(i=0;i<k;i++) {
num[i]=0;
A[i]='0';
B[i]='0';
}
}
scanf("%s",A);
Alength = strlen(A);
scanf("%s",B);
Blength = strlen(B);
k=Alength>Blength?Alength:Blength;
for(i=0;i<=k;i++) {
num[i]=0;
}
for(i=0;Blength>0&&Alength>0;i++) {
num[i]+=(toint(A[--Alength])+toint(B[--Blength]));
if(num[i]/10) {
num[i+1]=num[i]/10;
num[i]=num[i]%10;
k=1;
} else{
k=0;
}
}
if(0==Alength&&0==Blength) {
if(k==1){
k=i+1;
}else{
k=i;
}
}else if(0<Blength&&0==Alength) {
for(;Blength>0;i++) {
num[i]+=toint(B[--Blength]);
if(num[i]/10) {
num[i]=num[i]%10;
num[i+1]=num[i]/10;
k=1;
}else {
k=0;
}
}
if(k==1){
k=i+1;
}else{
k=i;
}
}else if(0<Alength&&0==Blength) {
for(;Alength>0;i++) {
num[i]+=toint(A[--Alength]);
if(num[i]/10) {
num[i]=num[i]%10;
num[i+1]=num[i]/10;
k=1;
}else {
k=0;
}
}
if(k==1){
k=i+1;
}else{
k=i;
}
}
printf("Case %d:\n",j++);
printf("%s + %s = ",A,B);
for(i=k-1;i>=0;i--) {
printf("%d",num[i]);
}
printf("\n");
}
}
int toint(char ch) {
return (ch-'0');
}
因为数组边界问题 我错了好多。。。。。