C语音的Java 2022-02-16 06:18 采纳率: 50%
浏览 136

问题描述   输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

问题遇到的现象和发生背景

问题描述
  输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

问题相关代码,请勿粘贴截图
//高精度加法
#include <stdio.h>
#define N 100
int Scanner(char T[])
{
    int i=0;
    scanf("%c",&T[i++]);
    while(T[i-1]>='0'&&T[i-1]<='9'){
        scanf("%c",&T[i++]);
    }
    return (i);
}
void px(char x[],int n)
{
    int i = 0;
    for(i;i<n-i;i++){
        char t = x[i];
        x[i] = x[n-i-1];
        x[n-i-1] = t;
    }
}
void Print_String(char max_s[],char min_s[],int max,int min)
{
    int i;
    for(i=0;i<min;i++){
        max_s[i]-=48;
        min_s[i]-=48;
        max_s[i]+=min_s[i];
        if(max_s[i]>9){
            max_s[i]-=10;
            max_s[i+1]+=1;
        }
    }
    if(max_s[i]==1){
        printf("1");
    }
    for(max;max>0;max--){
        if(max_s[max-1]>47){
            printf("%d",max_s[max-1]-48);
        }
        else if(max_s[max-1]<0){
            break;
        }
            else{
        printf("%d",max_s[max-1]);    
        }
    }
}
int main()
{
    char a[N],b[N];
    int a_xb = Scanner(a);
    int b_xb = Scanner(b);
    px(a,a_xb);
    px(b,b_xb);
    if(a_xb<b_xb){
    Print_String(b,a,b_xb,a_xb);    
    }else{
        Print_String(a,b,a_xb,b_xb);
    }
    return 0;
}

运行结果及报错内容

这个是蓝桥杯里 的一个习题,在提交的时候显示错误,请问我这个在哪里还有缺陷,我已经找不到了擦,
在我的输出函数中,最后一个字符为负数,这是为什么,

我的解答思路和尝试过的方法
我想要达到的结果

展开全部

  • 写回答

2条回答 默认 最新

  • piaoyiren 2022-02-16 06:29
    关注
    
    #include<stdio.h>
    #include<string.h>
    char c[1002]={0};
    int a[1000]={0};
    int b[1000]={0};
    int sum(int a[],int c1,int b[],int c2){
        int n=0;
        int r=0;
        bool flag = true; 
        
        for(int i=0;i<=c1;i++){
             int d = 0;
             if(i<c2){
                 
                d = a[i]+b[i]+r; 
             }else if(i<c1){
                 if(r==0){
                     n=c1;
                     c[i]=a[i]+'0';
                     flag=false;
                     //break;
                 }else{
                     d=a[i]+r;
                 }
                     
             }else if(r>0){
                 c[c1]='1';
                n=c1+1;    
                break;
             }
             r=0;
             if(flag){
                 if(d>=10){
                     r=1;
                    c[i]=(d-10)+'0';
                 }else{
                     c[i]=d+'0';
                 }             
             }
             
        }    
        return n;
    }
    int main(){
         int i,c1,z,c2;
         printf("请输入a的值:");
         scanf("%s",c);
         c1=strlen(c);
         for(i=0;i<=c1-1;i++){
            a[c1-1-i]=c[i]-'0'; 
         }
          printf("请输入b的值:");
          scanf("%s",c);
         c2=strlen(c);
         for(i=0;i<=c2-1;i++){
               b[c2-1-i]=c[i]-'0';
         }
         if(c1>=c2){
              z=sum(a,c1,b,c2);
         }else{
              z=sum(b,c2,a,c1);
         }
         for(i=z-1;i>=0;i--)
           printf("%c",c[i]);
        return 0;
    }
    

    展开全部

    评论
  • 拜见老天師 2022-02-16 06:32
    关注
    
    #include <stdio.h>
    #include <string.h>
    
    #define N 1000
    int main() {
        char ch1[N],ch2[N];
        scanf("%s %s",ch1,ch2);
        int len1=strlen(ch1),len2=strlen(ch2);
        if(len1==1 && len2==1 && ch1[0]=='0' && ch2[0]=='0') {
            //注意零相加的时候特殊情况
    //        cout<<'0';
            printf("0");
            return 0;
        }
        int a[N]= {0},b[N]= {0};
        if(len1>=len2) {
            for(int i=2; i<=len1+1; i++)
                a[i]=ch1[i-2]-'0';
            len1+=2;             //下标从2开始,留出进位空间
            for(int i=0; i<len2; i++)
                b[i]=ch2[len2-i-1]-'0';
            while(len2<len1)   //将两个加数的位数置同
                len2++;
            for(int i=0; i<len1; i++) {    //各位相加;
    
                a[len1-i-1]+=b[i];
                if(a[len1-i-1]>=10) {        //向前进位
                    a[len1-i-1]%=10;
                    a[len1-i-2]++;
                }
            }
        } else {
            for(int i=2; i<=len2+1; i++)
                a[i]=ch2[i-2]-'0';
            len2+=2;
            for(int i=0; i<len1; i++)
                b[i]=ch1[len1-i-1]-'0';
            while(len1<len2)   //将两个加数的位数置同
                len1++;
            for(int i=0; i<len2; i++) {    //各位相加;
    
                a[len2-i-1]+=b[i];
                if(a[len2-i-1]>=10) {        //向前进位
                    a[len2-i-1]%=10;
                    a[len2-i-2]++;
                }
            }
        }
        int i=0;
        while(1) {            //去除前面不必要的零
            if(a[i]) break;
            else i++;
        }
        for(i; i<len1; i++) //cout<<a[i];
            printf("%d",a[i]);
        return 0;
    }
    
    

    仅供参考,有帮助希望采纳

    展开全部

    评论
编辑
预览

报告相同问题?

手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部