您的位置:首页 > 产品设计 > UI/UE

Integer Inquiry -TJU1112

2016-09-11 11:11 344 查看
作为最简单的高精度加法,要注意的是如下几点,

第一,因为是数位达到上百位的大数,所以只能用字符串数组来存贮。

第二,为了方便之后的相加操作,应该把字符串数组逆序转化为一个整型数组。

第三,在控制进位的时候,应该用一个工具变量,假设为h,则h初始值为0.之后在循环体里h是等于对应位的两个数相加之后/10,使得下一次循环时,高位可以进位。

第四,因为已经把原来读取的大数用字符数组读入后又逆序复制到一个新的整型数组里,所以此时下标小的保存的就是低位,这个时候再控制循环变量从低位一直加到高位,
多余的位都是0,但是没关系,继续相加(如果不这样的话,最大的那一位可能会出现无法进位的情况,即读入的数是多少位,最后结果就是多少
位,显然是错误的)。。。


第五。在相加的时候,可以不必一位一位相加,可以4位4位相加,即万进制加法,其实万进制是很方便的一个方法,之后还会用万进制乘法,在节省时间方面是很有用的。
下面是AC代码,还是采用一位一位相加,采用的基本上是上述思想
注意此题输入结束标志:输入的那一行有且只有一个0结束,不是输入的第一个字符为0为结束标志,我原先判断结束的标志是当输入的一行字符串中第一个为0时程序结束,为此WA了好几次,在不是结束行中有可能会出现第一个字符为0.故判断结束时不能单单判断第一个字符是否为0,而应进一步说明那一行只有一个字符并接为0;

#include <iostream>
#include<cstring>
#include <cstdio>
using namespace std;
int a[1000]={0},b[205]={0};
char str[205];
int main()
{
int len1;
int j,i;
gets(str);
int len=strlen(str);
for(i=0,j=len-1;j>=0;j--,i++)
b[i]=str[j]-'0';
while(1)
{
if(str[0]=='0'&&str[1]=='\0')//注意判断结束的标志
break;
int h=0;
int m;

for(j=0;j<len;j++)
{
m=a[j]+b[j]+h;
a[j]=m%10;
h=m/10;
}
while(h)
{
a[j]=h%10;
len++;
h/=10;
}
gets(str);
len1=strlen(str);
for(i=0,j=len1-1;j>=0;j--,i++)
b[i]=str[j]-'0';
}
int p;
for(p=len-1;p>=0;p--)
cout<<a[p];
cout<<endl;
return 0;
}


#include<iostream>
#include<cstring>
using namespace std;
#define N 110
int main()
{
int sum
={0};
char str
;
while(cin>>str)
{
if(str[0]=='0'&&str[1]=='\0')//注意判断结束的标志
break;
int num
={0};
int len=strlen(str);
for(int i=0;i<len;i++)
num[i]=str[len-1-i]-'0';
for(int i=0;i<N;i++)
{
sum[i]+=num[i];
if(sum[i]>9)
{
sum[i]-=10;
sum[i+1]+=1;
}
//sum[i+1]+=(sum[i]+num[i])/10;
//sum[i]=(sum[i]+num[i])%10;
}
}
int k=N-1;
while(sum[k]==0) k--;
if(k<0)
cout<<0;
else
for(;k>=0;k--)
cout<<sum[k];
cout<<endl;
return 0;
}


C++代码 :

WA 好几次 没有这条语句的后半部分 if(str[0]=='0'&&str[1]=='\0'),即str[1]=='\0' 一直WA 很苦闷 别的OJ 能通过去的 附代码(AC)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: