c0605_两个超长正整数(每个最长80位数字)的加法运算


【问题描述】
编写程序实现两个超长正整数(每个最长80位数字)的加法运算。
【输入形式】
从键盘读入两个整数,要考虑输入高位可能为0的情况(如00083)。
1. 第一行是超长正整数A;
2. 第二行是超长正整数B;
【输出形式】
输出只有一行,是两个长整数的运算结果,从高到低依次输出各位数字。各位数字紧密输出。
算法提示:
1.用字符串输入两个超长整数,分别存放在两个字符串中,每一位对应一个字符串中的字符。
2.以较短的超长整数为基准,从低位到高位,对应位转换成数字后相加,再加上前一位相加的进位,得到的和模上10再转换为字符即为当前位,得到的和整除10即为当前位的进位。将计算得到的每一位保存到结果字符数组。
3.将较长字符串的剩余位加上最后一个进位移到结构数组后面。
4.将结果数组反序输出(去掉高位多余的0)。
【输入样例】
134098703578230056
234098
【输出样例】
134098703578464154
【样例说明】
进行两个正整数加法运算,134098703578230056 + 234098 = 134098703578464154。
【评分标准】
完全正确得20分,每个测试点4分,提交程序文件名为add.c。

----------------------------

个人代码:

#include <stdio.h>
#include <string.h>

int jinwei = 0;

int invert(char *s){
    int i=0,j,l;
    char temp;
    l = strlen(s);
    j = l-1;
    while(s[i]=='0'){
        l--;
        s[i] = s[j];
        s[j] = '\0';
        i++;
        j--;
    }
    for(;j>i;i++,j--){
        temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
    return l;
}

char add(int a, int b){
    int temp;
    temp = (a+b)%10+jinwei;
    jinwei = (a+b)/10;
    if(temp==10){
        temp = 0;
        jinwei++;
    }
    return temp+'0';
}

int main(){
    char a[128],b[128],res[128]={'0'};
    int la,lb,i,lres;
    gets(a);
    gets(b);
    la = invert(a);
    lb = invert(b);
    for(i=0;i<la&&i<lb;i++){
        res[i] = add(a[i]-'0',b[i]-'0');
    }
    if(la<lb){
        for(;b[i]!='\0';i++){
            res[i] = add(0,b[i]-'0');
        }
    }
    else{
        for(;a[i]!='\0';i++){
            res[i] = add(a[i]-'0',0);
        }
    }
    if(jinwei==1)
        res[i++] = '1';
    res[i] = '\0';
    lres = strlen(res);
    for(i=lres-1;i>=0;i--)
        printf("%c",res[i]);
    printf("\n");
    getchar();
    return 0;
}

标答:

#include <stdio.h>
#include <string.h>

main()
{
    char a[128], b[128], r[128] = "00000000000000";
    char *longer, *shorter;
    static int temp = 0;
    int i, j, lengthOfLonger, lengthOfShorter;

    scanf("%s %s", a, b);
    if (strlen(a) > strlen(b)) {
        longer = a;
        shorter = b;
    } else {
        longer = b;
        shorter = a;
    }
    lengthOfLonger = strlen(longer);
    lengthOfShorter = strlen(shorter);

    for (i = lengthOfShorter - 1, j = lengthOfLonger - 1; i >= 0; i--, j--) {    
        r[j+1] = longer[j] + shorter[i] - '0' + temp;
        if (r[j+1] > '9') {
            r[j+1] -= 10;
            temp = 1;
        } else {
            temp = 0;
        }
    }
    for (; j >= 0; j--) {
        r[j+1] = longer[j] + temp;
        if (r[j+1] > '9') {
            r[j+1] -= 10;
            temp = 1;
        } else {
            temp = 0;
        }
    }
    r[j + 1] = temp + '0';
    for (i = 0; r[i] == '0'; i++) {
        ;
    }
    for (; i < lengthOfLonger + 1; i++) {
        printf("%c", r[i]);
    }
    printf("\n");
}

----------------

1、对于两个数组a[]、b[],若需要区分长短,可以定义两个指针 *longer、*shorter,若 a[] 较长,则 longer = a,那么 a[] 就是 longer[],用这种方法来简化代码。

    char a[128], b[128];
    char *longer, *shorter;
    int lengthOfLonger, lengthOfShorter;

    scanf("%s %s", a, b);
    if (strlen(a) > strlen(b)) {
        longer = a;
        shorter = b;
    } else {
        longer = b;
        shorter = a;
    }
    lengthOfLonger = strlen(longer);
    lengthOfShorter = strlen(shorter);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



猜您在找 c0402_将两个两位数的正整数a、b合并为一个四位整数 leetcode给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 编程实现:对键盘输入的任意一个四位正整数,计算各位数字平方和。 两个大的正整数相加之和(C语言实现) 学习笔记-汇编-两个16位数字相加获得32位数字 给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM