杭电OJ1002

**问题描述:**对您来说,我有一个非常简单的问题。给定两个整数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');
}

因为数组边界问题 我错了好多。。。。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

name大权子

有钱的捧个钱场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值