鱼C论坛

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

C语言求助

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

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

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

x
求两个大的正整数相减的差。
输入
共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。
输出
一行,即所求的差。
样例输入 复制
9999999999999999999999999999999999999
9999999999999
样例输出 复制
9999999999999999999999990000000000000
请用C语言编写程序
小甲鱼最新课程 -> https://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;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. #define MAX_DIGITS 200

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

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

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

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

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

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

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

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

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

  42.     return 0;
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-22 00:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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