mwt20201010 2022-12-04 00:00 采纳率: 80%
浏览 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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 ABAQUS简单的带传动系统运转不了
      • ¥15 关于git actions自动部署的问题
      • ¥25 小程序 view wx:for 循环太多时,如何在循环结束执行某个事件?
      • ¥15 曲率模态差matlab程序计算
      • ¥15 大概算是比较简单的坐标系旋转问题
      • ¥15 关于#python#的问题:安装完gym环境后
      • ¥15 关于稳像云台姿态控制中相机姿态误差表征
      • ¥15 求sm16306s驱动例程
      • ¥15 本地生活媒体平台口碑选品怎么获得权限
      • ¥15 R语言 回归树/袋装树/随机森林预测