您的位置:首页 > 其它

POJ2602-Superlong sums

2011-07-29 20:17 405 查看
转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1305101054

非常恶心的大数相加= =

首先输入就够恶心了。。。哪有人逐位还要间断输入两个数的。。。。

注意:

如果用char[]保存加数和被加数,要用getchar()输入,

如果用int[]保存加数和被加数,要用scanf)输入。

用cin会超时,cin是重载函数,没有指定格式,输入时比较浪费时间

100W的空间不能局部静态申请,单可以全局静态申请,也可以局部动态申请(用new)

最恶心得是,我把结果开头的0(如果有的话)删去,竟然WA,真没见过这样的加法!

Output file should contain exactly N digits in a single line [/b]representing the sum of these two integers.

这是输出要求的格式,竟然要求 被加数、加数、和 的位数一致!!

按这样理解,这题是不允许最高位出现进位的!!

见过奇怪的,没见过这样奇怪的要求

/*char[]存储*/

//Memory  Time
//11972K 1594MS

#include<iostream>
#include<string>
using namespace std;

const int size=1000000;  //大数位数上限
int n;  //大数位数

int a[size+1];
int b[size+1];

void add(char* A,char* B,char* ans)
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int pa=0,pb=0;

int lena=strlen(A);
int lenb=strlen(B);

/*倒序*/

for(int i=lena-1;i>=0;i--)
a[pa++]=A[i]-'0';
for(int j=lenb-1;j>=0;j--)
b[pb++]=B[j]-'0';

int len=lena>lenb?lena:lenb;
char* c=new char[len+1];  //倒序的ans

int w=0;  //低位到高位的进位
for(int k=0;k<len;k++)
{
int temp=a[k]+b[k]+w;
c[k]=temp%10+'0';
w=temp/10;
}
len--;

for(w=0;len>=0;len--)  //w和len均作指针使用,已无意义
ans[w++]=c[len];
ans[w]='\0';

delete c;
return;
}

char A[size+1];
char B[size+1];
char ans[size+1];

int main(int i)
{
while(cin>>n)
{
getchar();
for(i=0;i<n;i++)
{
A[i]=getchar();
getchar();  //空格
B[i]=getchar();
getchar();  //回车
}
A[i]=B[i]='\0';

add(A,B,ans);
cout<<ans<<endl;
}
return 0;
}


================华丽的分割线================

/*Int[]存储*/

//Memory  Time
//17868K 1625MS

#include<iostream>
using namespace std;

int n;  //大数位数

void add(int* a,int* b,char* ans)
{
char* c=new char[n+1];  //倒序的ans

int w=0;  //低位到高位的进位
for(int k=0;k<n;k++)
{
int temp=a[k]+b[k]+w;
c[k]=temp%10+'0';
w=temp/10;
}

n--;
for(w=0;n>=0;n--)  //w和n均作指针使用,已无意义
ans[w++]=c
;
ans[w]='\0';

delete c;
return;
}

int main(int i)
{
while(cin>>n)
{
int* a=new int[n+1];
int* b=new int[n+1];
int* ta=new int[n+1];
int* tb=new int[n+1];
char* ans=new char[n+1];

for(i=0;i<n;i++)
scanf("%d %d",&ta[i],&tb[i]);

/*倒序*/

int pa=0,pb=0;
for(i=n-1;i>=0;i--)
{
a[pa++]=ta[i];
b[pb++]=tb[i];
}

add(a,b,ans);
cout<<ans<<endl;

delete a;
delete b;
delete ta;
delete tb;
delete ans;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: