把输入数据转换后放进二维数组,每列和做加法运算,目前的测试数据没问题

C语言 码拜 10年前 (2015-05-11) 939次浏览 0个评论

题目大意:求两个大数的加法

//看到有说数组大小开到250,我改了之后还是不行
//思路是将arr这个数组的每一行附上输入的值,然后求每列所有数之和,当然进位
//maxlen记录这个二维数组的有用就是可以加的长度列数,row用来记录行数,那就不用遍历二维数组所有行列
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char tempArr[250];
    int arr[250][250],fin[250],i,row=0,maxlen=0,column;
    /*下面这个while循环用来把每次输入的字符串先放在tempArr里,然后转换,放到arr里面*/
    while(scanf(“%s”,tempArr)!=EOF)
    {
        int len;
        len=strlen(tempArr);
        column=249;
        if(tempArr[0]==””0″” &&len==1)
            break;
        for(i=len-1;i>=0;i–)
        {
            arr[row][column]=tempArr[i]-“”0″”;//arr每一行最后几列用来存数字
            column–;
        }
        row++;//row记录行数
        if(maxlen<len)
        {
            maxlen=len;//记录输入的数中那个数的长度最长
        }
    }
    /*下面就是大数加法的算法实现*/
    int temp=0,index=249;
    for(column=249;column>(247-maxlen);column–)//从最后一列开始加
    {//估计最多进两位,所以循环出去的条件我就随便写了,下面有跳过前导0的
        int columnSum=0;
        for(i=0;i<row;i++)
        {
            columnSum+=arr[i][column];
        }
        fin[index]=(columnSum+temp)%10;//对这个数组的赋值也是从fin最后开始的
        temp=(columnSum+temp)/10;
        index–;
    }
    //得到第一个不为0的fin下标,从左至右
    while(fin[index]==0)
        index++;
        //从哪个位置开始输出
    for(i=index;i<=249;i++)
    {
        printf(“%d”,fin[i]);
    }
    printf(“\n”);
    return 0;
}

这道题允许
100
001
加起来
25分
仅供参考:

#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char a1[MAXLEN];
char a2[MAXLEN];
static int v1[MAXLEN];
static int v2[MAXLEN];
static int v3[MAXLEN];
int i,j,n,L,z;
void main(void) {
    scanf("%d",&n);
    for (j=0;j<n;j++) {
        scanf("%s%s",a1,a2);

        L=strlen(a1);
        for (i=0;i<L;i++) v1[i]=a1[L-1-i]-""0"";

        L=strlen(a2);
        for (i=0;i<L;i++) v2[i]=a2[L-1-i]-""0"";

        for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];

        for (i=0;i<MAXLEN;i++) {
            if (v3[i]>=10) {
                v3[i+1]+=v3[i]/10;
                v3[i]=v3[i]%10;
            }
        }

        printf("Case %d:\n", j+1);
        printf("%s + %s = ", a1, a2);

        z=0;
        for (i=MAXLEN-1;i>=0;i--) {
            if (z==0) {
                if (v3[i]!=0) {
                    printf("%d",v3[i]);
                    z=1;
                }
            } else {
                printf("%d",v3[i]);
            }
        }
        if (z==0) printf("0");

        printf("\n");
    }
}
//Sample Input
//3
//0 0
//1 2
//112233445566778899 998877665544332211
//
//Sample Output
//Case 1:
//0 + 0 = 0
//Case 2:
//1 + 2 = 3
//Case 3:
//112233445566778899 + 998877665544332211 = 1111111111111111110
由于最多进1
[code=c
v3[i+1]+=v3[i]/10;
//改为
v3[i+1]+=1;   //更好,更直接
][/code]

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明把输入数据转换后放进二维数组,每列和做加法运算,目前的测试数据没问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!