POJ 1503 Integer Inquiry(大数加…
2013-06-13 15:38
316 查看
题意:不废话,就是多个大数相加,输入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;
}
分析:做这一题就是对大数加法的一个熟悉的过程。只要,在输出的时候注意一下最后一行是个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;
}
相关文章推荐
- POJ 1503 Integer Inquiry 简单大数相加
- (高精度运算4.7.23)POJ 1503 Integer Inquiry(大数累加)
- POJ 1503 Integer Inquiry 简单大数相加
- POJ 1503 Integer Inquiry【大数相加 java】
- poj 1503 Integer Inquiry(多个大数相加)
- POJ 1503 Integer Inquiry【大数相加 java】
- POJ 1503 && HDU 1047 Integer Inquiry(高精度)
- POJ-1503 Integer Inquiry-多个大数相加
- POJ--1503:Integer Inquiry 大数加法
- POJ1503 UVA424 UVALive5399 Integer Inquiry【大数】
- POJ-1503-Integer Inquiry-大数加法
- POJ 1503 Integer Inquiry(大数相加,java)
- POJ 1053 Integer Inquiry && HDOJ 1047 Integer Inquiry (大数加法)
- POJ 1503 Integer Inquiry 【大数加法】
- POJ 1503 Integer Inquiry(大数相加)
- POJ 1503 Integer Inquiry(大数相加)
- poj 1503 Integer Inquiry
- POJ 1503 Integer Inquiry 大数 难度:0
- poj&nbsp;1716&nbsp;Integer&nbsp;Intervals(差分…
- 【原】 POJ 1503 Integer Inquiry 大整数加法 解题报告