问题:两个数字字符串相加,有定义:char s1[200],s2[200],s3[200],若输入s1和s2非全数字字符串,显示输入错误;否则计算s1与s2相加后的结果,存放于s3并显示。

本文介绍了一种处理大数字字符串相加的算法实现,通过将字符串逆序存储为整型数组,实现对位加法运算,有效处理了超出常规整型变量范围的数字相加问题。

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

问题:两个数字字符串相加,有定义:char s1[200],s2[200],s3[200],若输入s1和s2非全数字字符串,显示输入错误;否则计算s1与s2相加后的结果,存放于s3并显示。
例如输入:
999999999999999999999
999999999999999999999
例如输出
1999999999999999999998
输入:
1234567890123456789
876543211
输出:
1234567891000000000

解题思路:
输入两个字符串后,应先将字符串里的数字信息提取出来,以下代码中提供的思路是:将两个字符串的数字信息提取出来后反向存放到两个数组中,这就相当于数学加法中的对位操作,然后对两个数组进行带进位的加法运算,把运算结果存放到第三个数组上,然后再把第三个数组里的数字信息再反向转化成字符串,这样就得到所要结果。

解决代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct intArray{						//构建结构体,方便计算 
	int  len;							//字符串长度
	int  data[200];						//整型数组 
}; 
intArray change(char str[]){			//将字符串转化成数组,其中的数据逆序存放,方便计算时对位 
	intArray a;
	a.len=strlen(str);
	for(int i=0;i<a.len;i++){
		a.data[i]=str[a.len-1-i]-'0';		//从字符串中依次提取数字,并逆序存储在整型数组中 
	}
	return a; 
}
intArray add(intArray a1,intArray a2){		//对两结构体中的数组进行带进位的加法运算 
	intArray a;
	a.len=0; 
	int carry=0;							//用于存放进位
	for(int i=0;i<a1.len||i<a2.len;i++){
		if(a1.data[i]<0||a1.data[i]>9)		//防止将非数字字符的ASCII码读取进来 
			a1.data[i]=0;
		if(a2.data[i]<0||a2.data[i]>9)
			a2.data[i]=0;
		int tmp=a1.data[i]+a2.data[i]+carry;//计算两数和进位之和,结果为一位数或两位数 
		a.data[a.len++]=tmp%10;				//保存个位 
		carry=tmp/10;						//若有进位,保存进位 
	} 
	if(carry!=0){
		a.data[a.len++]=carry;				//最高位进位成为新的最高位 
	}
	return a; 
}

int main(){
	bool flag=true;					//用于判断是否含有非数字字符 
	char s1[200],s2[200],s3[200];
	printf("输入s1:");
	gets(s1);						//一次输入整个字符串s1
	for(int i=0;i<strlen(s1);i++){	//判断是否含有非数字字符
		if(s1[i]>'9'||s1[i]<'0'){
			flag=false;	
		}
	}
	
	printf("输入s2:");
	gets(s2);						//一次输入整个字符串s2
	for(int i=0;i<strlen(s2);i++){	//判断是否含有非数字字符
		if(s2[i]>'9'||s2[i]<'0'){
			flag=false;	
		}
	} 
	
	if(flag==false){				//判断是否含有非数字字符 
		printf("输入错误,含有非数字字符");
		return 0; 
	}
	
	printf("输出s3:");				//将逆序的数组转化成字符串
	intArray  intArray1=add(change(s1),change(s2));
	for(int i=intArray1.len-1,j=0;j<intArray1.len;i--,j++){
		s3[j]=intArray1.data[i]+'0';
	} 
	
	for(int i=0;i<intArray1.len;i++)//输出字符串
		printf("%c",s3[i]);
}

运行结果:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值