杭电1002大数加法

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define maxsize 55005

int main()
{
	int s,t;
	scanf("%d",&s);
	t=s;
	while(s--){
		char m[maxsize],n[maxsize];//输入的字符串 
		char mmt[maxsize],nnt[maxsize];//翻转后的字符串 
		int printarry[maxsize];//最后输出的数组 
		scanf("%s",m);
		scanf("%s",n);
		memset(printarry,0,sizeof(printarry));
		int len,lenm,lenn,ant;
		lenm=strlen(m),lenn=strlen(n);
		for(int i =lenm-1 ;i>=0;i--){
			mmt[lenm-i-1]=m[i];
		}
		for(int i =lenn-1 ;i>=0;i--){
			nnt[lenn-i-1]=n[i];
		}
		len=lenm>=lenn?lenm:lenn;//两个串的最大长度 
		for(int i=0;i<len;i++){
			if(i<=lenm-1&&i<=lenn-1){//两个串的第i个位置都不空 
				ant=0;
				ant=(int(mmt[i])+int(nnt[i])+printarry[i]-96)/10;//相加产生的进位 
				//一定要先除再取余!!! 
				printarry[i]=(int(mmt[i])+int(nnt[i])+printarry[i]-96)%10;//int完之后是ASCII码,0的ASCII码是48
				if(ant){
					printarry[i+1]++;//产生的进位添加到前一位 
				}
			}
			else if(i>lenm-1&&i<=lenn){
				printarry[i]=int(nnt[i])+printarry[i]-48;//第一个字串长度小于第二个字串长度 
			}
			else if(i<=lenm&&i>lenn-1){
				printarry[i]=int(mmt[i])+printarry[i]-48;//第二个字串长度小于第一个字串长度 
			}
		}
		int ans=t-s;
		printf("Case %d:\n",ans);//格式,记得大写 
		printf("%s",m);
		printf(" + ");
		printf("%s",n);
		printf(" = ");
		int w=printarry[len];//判断两个数相加,有没有产生溢出位 
		if(w){
			for(int i=len;i>=0;i--){//溢出,从溢出位开始输出 
				printf("%d",printarry[i]);
			}
		}
		else{
			for(int i=len-1;i>=0;i--){//没有溢出,从最大长度len处输出 
				printf("%d",printarry[i]);
			}
		}
		if(ans!=t) printf("\n\n");//每个结果要求的换行,最后一个数据之后还有 换行 
		else printf("\n");
	}
	return 0;
}

好长时间没写了,随便写了一下,发现忘的不少,记录一下吧。整体思想:输入,翻转,相加,进位加到前一位,输出。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值