mwt20201010 2022-12-04 00:00 采纳率: 100%
浏览 94
已结题

C语言高精度加减法出了问题


#include <stdio.h>
#include <string.h>

int compare(int *b, int *c, int l1, int l2) {//比较两个数哪个大
    if (l1 > l2)
        return 1;
    if (l1 < l2)
        return 0;
    if (l1 == l2) {
        int i;
        for (i = l1 - 1; i >= 0; i--) {
            if (b[i] > c[i])
                return 1;
            if (b[i] < c[i])
                return 0;
        }
        if (i == -1)
            return 1;
    }
}

int minus(int *b, int *c, int *d, int max) {//做减法
    int i, num;
    for (i = 0; i < max; i++) {
        num = b[i] - c[i] + d[i];
        if (num < 0) {
            num += 10;
            d[i + 1] = -1;
        }
        d[i] = num;
    }
}

int main() {
    int n;
    scanf("%d\n", &n);
    for (int s = 0; s < n; s++) {
        char a[1004] = {0}, b[502] = {0}, c[502] = {0}, ch;
        int d[503] = {};
        scanf("%s", a);
        int l = strlen(a);
        int i = 0, j = 0, flag = 0;
        for (i = 0; i < l; i++) {//将两个数倒序存入b、c数组中
            if (a[l - i - 1] == '+' || a[l - i - 1] == '-') {
                flag = 1, j = 0;
                ch = a[l - i - 1];
                continue;
            }
            if (flag == 0) {
                c[j] = a[l - i - 1];
                j++;
            } else {
                b[j] = a[l - i - 1];
                j++;
            }
        }
        int l1 = strlen(b), l2 = strlen(c), max = 0, num;
        max = (l1 >= l2) ? l1 : l2;
        for (i = 0; i < l1; i++)
            b[i] = b[i] - '0';
        for (i = 0; i < l2; i++)
            c[i] = c[i] - '0';
        if (ch == '+') {//做加法
            for (i = 0; i < max; i++) {
                num = b[i] + c[i] + d[i];
                if (num >= 10) {
                    num -= 10;
                    d[i + 1] = 1;
                }
                d[i] = num;
            }
        } else {
            if (compare((int *)b, (int *)c, l1, l2))
                minus((int *)b, (int *)c, d, max);
            else {
                minus((int *)c, (int *)b, d, max);
                printf("-");
            }
        }
        for (i = 500; i >= 0; i--) {//找出第一个不为0的值
            if (d[i] != 0)
                break;
        }
        //printf("%d\n", i);
        if (i == -1 && d[0] == 0)
            printf("0\n");
        else {
            for (; i >= 0; i--)
                printf("%d", d[i]);
            printf("\n");
        }
    }
    return 0;
}

这是代码,只有减法部分出了问题,另外还有一个名字叫小蜜蜂但本质是斐波那契数列的题目,题目如下
** 一只小蜜蜂在如下图所示的蜂窝上爬行。它爬行时,只能从一个格爬到相邻的大号格子中。例如,从 1 号格子可以爬到 2 号或者 3 号格子,从 2 号则可以爬到 3 号或者 4 号格子。
 
    请问从一个格子 a 爬到一个格子 b 一共有多少种可行的路线。
输入:
    分别是起始点 a 和终止点 b 的编号。( a 和 b 在 1~100 之间,且 a<b 。)
输出:
    方案数量。
 测试输入期待的输出时间限制内存限制额外进程
测试用例 1 以文本方式显示1 4↵
以文本方式显示3↵
1秒 64M 0
测试用例 2 以文本方式显示1 5↵
以文本方式显示5↵
1秒 64M 0
测试用例 3 以文本方式显示1 50↵
以文本方式显示12586269025↵
1秒 64M 0
测试用例 4 以文本方式显示2 50↵
以文本方式显示7778742049↵
1秒 64M 0
测试用例 7 以文本方式显示1 100↵
以文本方式显示354224848179261915075↵
1秒 64M 0 **

#include <stdio.h>

int main() {
    int a, b, i, j, t = 0;//t是进位
    int c[101][101] = {0};
    c[0][0] = 1, c[1][0] = 1;
    scanf("%d %d", &a, &b);
    for (i = 2; i <= b - a; i++) {
        t = 0;
        for (j = 0; c[i - 1][j] != 0; j++) {
            c[i][j] = (c[i - 1][j] + c[i - 2][j] + t) % 10;
            t = (c[i - 1][j] + c[i - 2][j] + t) / 10;
        }
    }
    if (t != 0)
        printf("1");
    j--;
    for (; j >= 0; j--)
        printf("%d", c[i - 1][j]);//倒序输出
    printf("\n");
    return 0;
}

之前我测出来貌似是内循环少循环一次,但是不知道为什么
最后想问一下这种加减的用哪种方法更好一些,感觉有很多方法,(本想加题目图片的,但是一点进图片标识就卡住了,无语😓)

  • 写回答

4条回答 默认 最新

  • X-道至简 2022-12-04 08:28
    关注

    代码最好放代码块里 方便看
    第一个题 减法肯定错了 因为把char的指针转成int 指针。每个元素的长度字节数变化了,比如char a[4] 这个是4个元素。转成int 就只有一个元素 4个字节合成一个了。不能随便转换
    第二个题 最好题目帖一下 好像和网上的小蜜蜂不一样

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 12月12日
  • 已采纳回答 12月4日
  • 修改了问题 12月4日
  • 修改了问题 12月4日
  • 展开全部

悬赏问题

  • ¥15 数据库数据成问号了,前台查询正常,数据库查询是?号
  • ¥15 算法使用了tf-idf,用手肘图确定k值确定不了,第四轮廓系数又太小才有0.006088746097507285,如何解决?(相关搜索:数据处理)
  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决