全解题报告索引目录 -> 【北大ACM – POJ试题分类】
转载请注明出处:http://exp-blog.com
-------------------------------------------------------------------------
非常恶心的大数相加= =
首先输入就够恶心了。。。哪有人逐位还要间断输入两个数的。。。。
注意:
如果用char[]保存加数和被加数,要用getchar()输入,
如果用int[]保存加数和被加数,要用scanf)输入。
用cin会超时,cin是重载函数,没有指定格式,输入时比较浪费时间
100W的空间不能局部静态申请,单可以全局静态申请,也可以局部动态申请(用new)
最恶心得是,我把结果开头的0(如果有的话)删去,竟然WA,真没见过这样的加法!
Output file should contain exactly N digits in a single linerepresenting 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[n];
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;
}