POJ 1503 Integer Inquiry(大数加…

题意:不废话,就是多个大数相加,输入0时,终止.

分析:做这一题就是对大数加法的一个熟悉的过程。只要,在输出的时候注意一下最后一行是个0就行。

 

贴上AC代码:

(164K ,0M)

 

C语言:
#include<stdio.h>
#include<string.h>
#define NM 101
char a [ NM ], sum [ NM + 1 ] = { 0 };
int main()
{
    int i , j , la , k , l = 0;
    for( i = 0; i < 101; i ++)
    {
        memset( a , '\0' , sizeof( a));
        scanf( "%s" , a);        

        la = strlen( a);

        for( j = la - 1 , k = 0; j >= 0; j --)        
            sum [ k ++ ] += a [ j ] - '0';
        l = la > l ? la : l;

        for( j = 0; j < l; j ++)
            if( sum [ j ] >= 10)
            {
                sum [ j ] -= 10;
                sum [ j + 1 ] ++;
            }
            if( sum [ j ]) l ++;           //进位,不是前面的for循环的内容,j是前面的最大值。如果sum[j]!=0的话,要进位
            if( strcmp( a , "0") == 0)
            {
                for( j = l - 1; j >= 0; j --)
                {
                    printf( "%d" , sum [ j ]);
                }
                printf( " \n ");
                break;
            }
    }
}

 

 

收获:写代码之前曾经看过好几种不同风格的代码,也简单研究并分析了各种大数加法版本,最后还是选定了一个代码风格比较适合我的一段代码,然后按照这个风格敲了段两个大数相加的代码。

大数的运算基本上都是用c语言写的,输入输出的话,用c++确实不知道怎么整

首先,分析一下大数运算的原理吧。

1.输入,定义char数组,不妨设为char a[NM]然后scanf("%s",a);,另一个就命名为char b[NM] scanf("%s",b);

放在一起输入就可以了。另外由于需要用一个数组存放两个大数相加的和,所以这个数组就稍稍开大一点,命名为char sum[NM+1]={0};

这就是输入了,为了后面相加的需要,肯定要求出长度,la=strlen(a);lb=strlen(b);

2.中间写程序的思路,原理就是小学的列式相加了,不再废话,关键是如何实现。

  由于存入的字符,所以各个数字相加也是按照ASCII码的大小来进行运算的,肯定不能这么做。所以要重新个数组,把数字存进去(换成ASCII大小为0~9的几个字符,结果输出ASCII码就行了)

按照这个思路:

for(j=la-1,k=0;j>=0;j--)//由于输入的时候,a[0]存的是最高位,所以这儿按照倒序重新存,为了计算需要。

sum[k++]=a[j]-'0';  //这儿也可以写a[j]-48,反正是拿ASCII码来做的,k++也可以放到上面的语句,意思一样

for(j=lb-1,k=0;j>=0;j--)

sum[k++]+=b[j]-'0';      //这儿就直接相加,想重新设两个数组,存完再计算也行

l=la>lb?la:lb;     //l的值肯定要选a,b最长的一个了

for(j=0;j<l;j++)   //上面相加之后,应该会出现某一位的数大于10的情况,小学加法学过,所以要处理一下

if(sum[j]>10)          //这儿就已经对应了,从小到大的数组顺序,存储个位往上升的位次

{

   sum[j]-=10;

   sum[j+1]++;   //高的一位加1

}

 

if(sum[j])l++; 

 

for(j=l-1;j>=0;j--)             //输出

printf("%d",sum[j]);

printf("\n");

 

这就是我对整个大数计算的全部解剖了,纠结了一天多的时间彻底懂了大数加法

 

 两个大数相加的代码:

C语言:
#include<stdio.h>
#include<string.h>
#define NM 1001
char a [ NM ],b [ NM ], sum [ NM + 1 ] = { 0 };
int main()
{
    int j , la , lb , k , l;
    scanf( "%s%s" , a ,b);        
    la = strlen( a);
    lb = strlen(b);
    for( j = la - 1 , k = 0; j >= 0; j --)        
        sum [ k ++ ] = a [ j ] - '0';
    for( j = lb - 1 , k = 0; j >= 0; j --)
        sum [ k ++ ] +=b [ j ] - '0';
    l = la > lb ? la : lb;
    for( j = 0; j < l; j ++)
        if( sum [ j ] >= 10)
        {
            sum [ j ] -= 10;
            sum [ j + 1 ] ++;
        }
        if( sum [ j ]) l ++;          
        //开始的时候想用l=strlen(l);为什么这儿用l=strlen(sum);不行?原来是是理解有问题。最后一位没有"\0",没法判断呀。
        //进位,不是前面的for循环的内容,j是前面的最大值。如果sum[j]!=0的话,要进位
        //例如:本来123+987,l=3,但是后来   结果大于1000, 所以l++

        for( j = l - 1; j >= 0; j --)
        {
            printf( "%d" , sum [ j ]);
        }
        printf( " \n ");
        return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值