复杂A+B问题(两个很大的数相加问题)

复杂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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值