复杂A+B问题(两个很大的数相加问题)
思路:用字符串实现
*1.先将A和B以字符串的形式输入。
2.调用字符串函数求A和 B的长度
3.找出长的字符串数组作为存放和的数组
4.将A和B逆序——一位一位从后往前加
5.定义变量one——表示是否要进位
6.定义变量sum——存放临时和(比如:5+9=14)
7.求sum = str1[i]-‘0’+str2[i]-‘0’+one; //将字符数字变为普通数字
8.求one = sum/10; //判断是否要进位
9.求本位数 temp = sum%10; //得出本位的数字
10.再将本位数转化为字符串 str1[i] = temp+‘0’;
11.如果短的字符串数组用完,只需把长的字符串数组复制到存和数组
12.注意进位判断:
temp = str1[i]-‘0’+one;
one = temp/10;
temp = temp%10;
str1[i] = temp+‘0’;
13.最后一步还得判断是否存和数组得变长:
if (one)
str1[strlen(str1)]=‘1’;//如果最后一位要进位
//则数组的长度会加1,同时把下一位赋值1
(如果自定义存和数组为长数组加一就可以不用判断)
*
代码实现:
#include<stdio.h>
#include<string.h>
void reversal(char *str) //字符数组逆序
{
int len = strlen(str);
int i;
for (i=0;i<(len+1)/2;i++)
{
char p; //临时字符用来做交换的中间变量
p = str[i];
str[i] = str[len-i-1];
str[len-1-i] = p;
}
}
void aid(char *str1,char *str2) //求复杂A+B问题
{
int one = 0; //定义one 看是否要进1
int temp = 0; //定义临时和,大于10就进1,小于就不进
int i;
if (strlen(str1)>strlen(str2)) //寻找长的数组作为放和数组
{
for (i=0;i<strlen(str2);i++)
{
temp = str1[i]-'0'+str2[i]-'0'+one; //将字符数字变为普通数字
one = temp/10; //判断是否要进位
temp = temp%10; //得出本位的数字
str1[i] = temp+'0';
}
for (i=strlen(str2);i<strlen(str1);i++)//当短的数组用完,只需把长数组的数组移入即可
{ //但是的判断短数组的最后一位是否要进位
temp = str1[i]-'0'+one;
one = temp/10;
temp = temp%10;
str1[i] = temp+'0';
}
if (one)
str1[strlen(str1)]='1';//如果最后一位要进位
//则数组的长度会加1,同时把下一位赋值1
}
else //同理 if
{
for (i=0;i<strlen(str1);i++)
{
temp = str1[i]-'0'+str2[i]-'0'+one;
one = temp/10;
temp = temp%10;
str2[i] = temp+'0';
}
for (i=strlen(str1);i<strlen(str2);i++)
{
temp = str2[i]-'0'+one;
one = temp/10;
temp = temp%10;
str2[i] = temp+'0';
}
if (one)
str2[strlen(str2)]='1';
}
}
int main()
{
char str1[1000];
char str2[1000];
scanf("%s",&str1);
scanf("%s",&str2);
reversal(str1);
reversal(str2);
aid(str1,str2);
if (strlen(str1)>strlen(str2))
{
reversal(str1);
puts(str1);
}
else
{
reversal(str2);
puts(str2);
}
return 0;
}