C语言(18)A+B Problem II

本文介绍了一种处理大数加法的算法实现方法,通过字符串倒序处理和逐位相加的方式,解决了传统32位整数溢出的问题。适用于处理长度不超过1000位的大整数相加。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

描述

I have a very simple problem for you. Given two integers A and B, your job is to calculate the Sum of A + B.

A,B must be positive.

输入

The 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 consists of two positive integers, A and B. Notice that the integers are very large, that means you should not process them by using 32-bit integer. You may assume the length of each integer will not exceed 1000.

输出

For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line is the an equation "A + B = Sum", Sum means the result of A + B. Note there are some spaces int the equation.

样例输入

2
1 2
112233445566778899 998877665544332211

样例输出

Case 1:
1 + 2 = 3
Case 2:
112233445566778899 + 998877665544332211 = 1111111111111111110
#include <stdio.h>
#include <string.h>

int main(void)
{
	int t, len1, len2, len3, i, j, max, min, flag;
	char str1[1000], str2[1000], str3[1000], str4[1000],re[1001];
	char temp,temp1;

	scanf("%d", &t);
	for(j=0; j<t; j++){
		bzero(str1, sizeof(str1));
		bzero(str2, sizeof(str2));
		bzero(str3, sizeof(str3));
		bzero(str4, sizeof(str4));
		bzero(re, sizeof(re));
		scanf("%s%s", str1, str2);

		len1=strlen(str1);	
		len2=strlen(str2);

		//printf("str1:%s %s\n", str1, str2);
		strcpy(str3, str1);
		strcpy(str4, str2);
		/*字符串倒序*/
		for(i=0; i<len1/2; i++){
			temp=str1[i];
			str1[i]=str1[len1-1-i];
			str1[len1-1-i]=temp;
		}
		for(i=0; i<len2/2; i++){
			temp=str2[i];
			str2[i]=str2[len2-1-i];
			str2[len2-1-i]=temp;
		}

		if(len1>len2){
			max=len1;
			min=len2;
		}else{
			max=len2;
			min=len1;
		}

		/*运算*/
		flag=0;
		for(i=0; i<max; i++){
			if(i<min){
				temp1=str1[i]+str2[i]+flag-'0';
			}else{
				temp1=str1[i]+str2[i]+flag;
			}
			//printf(": %c %c\n", str1[i], str2[i]);
			if(temp1 > '9'){
				re[i]=temp1-10;
				flag=1;
			}else{
				re[i]=temp1;
				flag=0;
			}
		}
		if(flag==1){
			re[i]='1';
			re[i+1]='\0';
		}

		len3=strlen(re);
		for(i=0; i<len3/2; i++){
			temp=re[i];
			re[i]=re[len3-1-i];
			re[len3-1-i]=temp;
		}
		printf("Case %d:\n%s + %s = %s\n", j+1, str3, str4, re);

	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值