鱼C论坛

 找回密码
 立即注册
查看: 1266|回复: 2

C语言求助

[复制链接]
发表于 2023-10-25 11:06:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入 复制
9999999999999999999999999999999999999
9999999999999
样例输出 复制
9999999999999999999999990000000000000
请用C语言编写程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-10-25 11:06:19 | 显示全部楼层
#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 201

void subtract(char *a, char *b, char *result) {
    int carry = 0;
    int len_a = strlen(a);
    int len_b = strlen(b);
    int diff = len_a - len_b;
   
    for (int i = len_b - 1; i >= 0; i--) {
        int digit_a = a[i + diff] - '0';
        int digit_b = b[ i] - '0';
        int digit_diff = digit_a - digit_b - carry;
        
        if (digit_diff < 0) {
            digit_diff += 10;
            carry = 1;
        } else {
            carry = 0;
        }
        
        result[i + diff] = digit_diff + '0';
    }
   
    for (int i = diff - 1; i >= 0; i--) {
        int digit_a = a[ i] - '0';
        int digit_diff = digit_a - carry;
        
        if (digit_diff < 0) {
            digit_diff += 10;
            carry = 1;
        } else {
            carry = 0;
        }
        
        result[ i] = digit_diff + '0';
    }
   
    result[len_a] = '\0';
}

int main() {
    char a[MAX_DIGITS];
    char b[MAX_DIGITS];
    char result[MAX_DIGITS];
   
    scanf("%s", a);
    scanf("%s", b);
   
    subtract(a, b, result);
   
    printf("%s\n", result);
   
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-26 10:11:14 | 显示全部楼层
#include <stdio.h>
#include <string.h>

#define MAX_DIGITS 200

void subtract(char *a, char *b, char *result) {
    int a_len = strlen(a);
    int b_len = strlen(b);
    int result_len = a_len - b_len + 1; // 计算结果长度,加1是为了保证有足够的空间存储结果
    int carry = 0; // 进位标志
    int i, j;

    // 从低位开始相减,需要保证b的位数不高于a
    for (i = 0; i < a_len || i < b_len; i++) {
        int digit_a = (i < a_len) ? (a[i] - '0') : 0; // 如果a已经遍历完,则将高位补0
        int digit_b = (i < b_len) ? (b[i] - '0') : 0; // 如果b已经遍历完,则将高位补0
        int diff = digit_a - digit_b - carry; // 相减并考虑进位
        carry = (diff < 0) ? 1 : 0; // 如果相减结果小于0,则需要向高位借位
        result[i] = (diff + 10) % 10 + '0'; // 将计算结果转换为字符并存储到result中
    }

    // 处理最高位的进位
    if (carry > 0) {
        result[result_len] = carry + '0';
        result_len++;
    }

    // 在结果后面添加一个结束符
    result[result_len] = '\0';

    // 将结果反转,因为从低位到高位存储时是反的
    for (i = 0, j = result_len - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

int main() {
    char a[MAX_DIGITS + 1]; // 被减数a
    char b[MAX_DIGITS + 1]; // 减数b
    char result[MAX_DIGITS + 1]; // 结果

    // 读入被减数和减数
    scanf("%s %s", a, b);

    // 计算差值并存储到结果中
    subtract(a, b, result);

    // 输出结果
    printf("%s\n", result);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 17:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表