2202_75587406 2023-03-12 16:01 采纳率: 100%
浏览 32
已结题

我的高精度减法结果不是正确的,有谁帮我看下

它输出的结果不正确

#include<bits/stdc++.h>
using namespace std;
char s1[10090],s2[10090],s3[10090];
int a[10090],b[10090],c[10090]; 
bool cmp(char s1[],char s2[]){
    int n=strlen(s1),m=strlen(s2);
    if(n!=m){
        return n<m;
    }else{
        for(int i=0;i<n;i++){
            if(s1[i]!=s2[i]){
                return s1[i]<s2[i];
            }
        }
        return false;
    }
}
int main(){
    int la,lb,lc;
    int i;
    memset(a,0,sizeof(a));  
    memset(b,0,sizeof(b));  
    memset(c,0,sizeof(c));  
    cin>>s1>>s2;
    la=strlen(s1);
    lb=strlen(s2);
    if(cmp(s1,s2)){
        strcpy(s3,s1);
        strcpy(s1,s2);
        strcpy(s2,s3);
        cout<<"-";
    }
    la=strlen(s1),lb=strlen(s2);
    for(i=0;i<la;i++) a[la-i]=s1[i]-'0';
    for(i=0;i<lb;i++) b[lb-i]=s1[i]-'0';
    lc=max(la,lb);
    i=1;
    while(i<=la || i<=lb){
        if(a[i]<b[i]){
            a[i]+=10;
            a[i+1]--;
        }
        c[i]=a[i]-b[i];
        i++; 
    }
    while(c[lc]==0 && lc>1) lc--;
    for(i=lc;i>=1;i--){
        cout<<c[i]; 
    }
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 嗷呜大嘴狼 2023-03-12 16:04
    关注

    在您的代码中,减法的部分有问题。您用了 s1 的长度去循环数组 b,导致 b 数组没有赋值,后面减法出现问题。应该将 s2 的长度赋值给 lb,循环数组 b 时使用 lb。同时,循环数组 a 和 b 时应该使用 lc,保证从高位到低位依次进行减法运算。

    下面是修正后的代码:

    #include<bits/stdc++.h>
    using namespace std;
    char s1[10090],s2[10090],s3[10090];
    int a[10090],b[10090],c[10090]; 
    bool cmp(char s1[],char s2[]){
        int n=strlen(s1),m=strlen(s2);
        if(n!=m){
            return n<m;
        }else{
            for(int i=0;i<n;i++){
                if(s1[i]!=s2[i]){
                    return s1[i]<s2[i];
                }
            }
            return false;
        }
    }
    int main(){
        int la,lb,lc;
        int i;
        memset(a,0,sizeof(a));  
        memset(b,0,sizeof(b));  
        memset(c,0,sizeof(c));  
        cin>>s1>>s2;
        la=strlen(s1);
        lb=strlen(s2);
        if(cmp(s1,s2)){
            strcpy(s3,s1);
            strcpy(s1,s2);
            strcpy(s2,s3);
            cout<<"-";
        }
        la=strlen(s1),lb=strlen(s2);
        for(i=0;i<la;i++) a[la-i]=s1[i]-'0';
        for(i=0;i<lb;i++) b[lb-i]=s2[i]-'0';
        lc=max(la,lb);
        i=1;
        while(i<=lc){
            if(a[i]<b[i]){
                a[i]+=10;
                a[i+1]--;
            }
            c[i]=a[i]-b[i];
            i++; 
        }
        while(c[lc]==0 && lc>1) lc--;
        for(i=lc;i>=1;i--){
            cout<<c[i]; 
        }
        return 0;
    }
    
    
    

    答案来自c++ https://www.wodianping.com/

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

报告相同问题?

问题事件

  • 系统已结题 3月20日
  • 已采纳回答 3月12日
  • 创建了问题 3月12日

悬赏问题

  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等
  • ¥15 matlab 用yalmip搭建模型,cplex求解,线性化处理的方法
  • ¥15 qt6.6.3 基于百度云的语音识别 不会改
  • ¥15 关于#目标检测#的问题:大概就是类似后台自动检测某下架商品的库存,在他监测到该商品上架并且可以购买的瞬间点击立即购买下单
  • ¥15 神经网络怎么把隐含层变量融合到损失函数中?
  • ¥15 lingo18勾选global solver求解使用的算法
  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来