问题:两个数字字符串相加,有定义: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]);
}
运行结果: