Fly.c 2021-09-18 20:03 采纳率: 75%
浏览 12
已结题

大数算和的问题,应该是某处逻辑又崩了

能否帮忙找一下逻辑错误,我有点崩,牛客网上那个第四组案例真有那么大的数啊。

char* resolve(char arr[])//倒转字符串的函数
{
    int r = strlen(arr) - 1;
    int l = 0;
    while (l < r)
    {
        char mid = arr[l];
        arr[l] = arr[r];
        arr[r] = mid;
        l++;
        r--;
    }
    return arr;
}
void restr(char* t, char* s,int tr,int sr)//t right,s right
{
    //t比s长才执行这个函数
    int i = 0;
    for (i = 0; i <= tr; i++)
    {
        char mid = t[i];
        t[i] = s[i];
        s[i] = mid;
    }
}
char* solve(char* s, char* t)//大数相加函数
{
    // write code here
    char p[100001] = { 0 };
    int slen = strlen(s);//计算长度,方便对位计算(个位加个位,十位加十位)
    int tlen = strlen(t);
//谁长以谁为准来确定位,但就让长的变成slen,s
    if (tlen >slen)
    {
        restr(t, s,tlen - 1,slen - 1);
        int mid = slen;
        slen = tlen;
        tlen = mid;
    }
        int i = 0;
        int n = 0;//用来存储进位产生的1,但初始时肯定是0没有进1的
        for (i = 0; i < slen + 1; i++)
        {
            if (i < tlen)
            {
                if (*(s + slen - i - 1) + *(t + tlen - i - 1) + n - 2 * '0' < 10)//未产生进位
                {
                    p[i] = *(s + slen - i - 1) + *(t + tlen - i - 1) + n - '0';
                    n = 0;
                }
                else //产生进位
                {
                    int sum = *(s + slen - i - 1) + *(t + tlen - i - 1) + n - 2 * '0';//这是一个二位数了
                    p[i] = sum - 10 + '0';
                    n = 1;
                }
            }
            else if (i < slen)//这时下标越过短的数字了,就完全在长数字里
            {
                if (n == 1)//在与短数字最高位运算后,是否进1
                {
                    int mid = *(s + slen - i - 1) + n - '0';
                    if (mid < 10)//进1后是否能又进1
                    {
                        p[i] = mid + '0';
                        n = 0;
                    }
                    else
                    {
                        p[i] = mid - 10 + '0';
                    }
                }
                else
                {
                    p[i] = *(s + slen - i - 1);
                }
            }
            else
            {
                if (n)//如果在长数字最高位运算后仍进1
                {
                    p[i] = '1';
                }
            }

        }
        return resolve(p);//返回字符串时还应注意将字符串颠倒一下
    
}
int main()
{
    char arr1[100000] = { 0 };//整数1
    char arr2[100000] = { 0 };//整数2
    scanf("%s", arr1);
    scanf("%s", arr2);
    printf("%s\n", solve(arr1, arr2));
    return 0;
}


  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 9月26日
    • 创建了问题 9月18日

    悬赏问题

    • ¥20 物理远程控制麦克风使用问题
    • ¥15 在hololens1上运行unity项目只有空窗口
    • ¥25 TABLEAU PREP无法打开
    • ¥15 百度帐号问题/centos
    • ¥15 关于#c语言#的问题:求完整代码条件好说
    • ¥100 HALCON DELPHI
    • ¥15 (需要远程,AI不回)VB6二进制文件转换成功,但是C#转换总是失败
    • ¥15 关于#matlab#的问题:有没有什么其他办法能够保证不退出进程(相关搜索:matlab调用)
    • ¥15 依据报错在原代吗格式的基础上解决问题
    • ¥15 在虚拟机中安装flash code