POJ2602-Superlong sums

来源:互联网 时间:1970-01-01

转载请注明出处:優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 representing the sum of these two integers.

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

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

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

 1 /*char[]存储*/
2
3 //Memory Time
4 //11972K 1594MS
5
6 #include<iostream>
7 #include<string>
8 using namespace std;
9
10 const int size=1000000; //大数位数上限
11 int n; //大数位数
12
13 int a[size+1];
14 int b[size+1];
15
16 void add(char* A,char* B,char* ans)
17 {
18 memset(a,0,sizeof(a));
19 memset(b,0,sizeof(b));
20 int pa=0,pb=0;
21
22 int lena=strlen(A);
23 int lenb=strlen(B);
24
25 /*倒序*/
26
27 for(int i=lena-1;i>=0;i--)
28 a[pa++]=A[i]-'0';
29 for(int j=lenb-1;j>=0;j--)
30 b[pb++]=B[j]-'0';
31
32 int len=lena>lenb?lena:lenb;
33 char* c=new char[len+1]; //倒序的ans
34
35 int w=0; //低位到高位的进位
36 for(int k=0;k<len;k++)
37 {
38 int temp=a[k]+b[k]+w;
39 c[k]=temp%10+'0';
40 w=temp/10;
41 }
42 len--;
43
44 for(w=0;len>=0;len--) //w和len均作指针使用,已无意义
45 ans[w++]=c[len];
46 ans[w]='/0';
47
48 delete c;
49 return;
50 }
51
52 char A[size+1];
53 char B[size+1];
54 char ans[size+1];
55
56 int main(int i)
57 {
58 while(cin>>n)
59 {
60 getchar();
61 for(i=0;i<n;i++)
62 {
63 A[i]=getchar();
64 getchar(); //空格
65 B[i]=getchar();
66 getchar(); //回车
67 }
68 A[i]=B[i]='/0';
69
70 add(A,B,ans);
71 cout<<ans<<endl;
72 }
73 return 0;
74 }

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

 1 /*Int[]存储*/
2
3 //Memory Time
4 //17868K 1625MS
5
6 #include<iostream>
7 using namespace std;
8
9 int n; //大数位数
10
11 void add(int* a,int* b,char* ans)
12 {
13 char* c=new char[n+1]; //倒序的ans
14
15 int w=0; //低位到高位的进位
16 for(int k=0;k<n;k++)
17 {
18 int temp=a[k]+b[k]+w;
19 c[k]=temp%10+'0';
20 w=temp/10;
21 }
22
23 n--;
24 for(w=0;n>=0;n--) //w和n均作指针使用,已无意义
25 ans[w++]=c[n];
26 ans[w]='/0';
27
28 delete c;
29 return;
30 }
31
32 int main(int i)
33 {
34 while(cin>>n)
35 {
36 int* a=new int[n+1];
37 int* b=new int[n+1];
38 int* ta=new int[n+1];
39 int* tb=new int[n+1];
40 char* ans=new char[n+1];
41
42 for(i=0;i<n;i++)
43 scanf("%d %d",&ta[i],&tb[i]);
44
45 /*倒序*/
46
47 int pa=0,pb=0;
48 for(i=n-1;i>=0;i--)
49 {
50 a[pa++]=ta[i];
51 b[pb++]=tb[i];
52 }
53
54 add(a,b,ans);
55 cout<<ans<<endl;
56
57 delete a;
58 delete b;
59 delete ta;
60 delete tb;
61 delete ans;
62 }
63 return 0;
64 }
我的所有ACM解题报告:http://user.qzone.qq.com/289065406/blog/1301632863我的CSDN:http://hi.csdn.net/invite.php?u=10114444&c=57929f66dd919f2b我的新浪微博:http://weibo.com/lyy289065406我的腾讯微博:http://t.qq.com/liao5422我的QQ空间:http://user.qzone.qq.com/289065406我的百度空间:http://hi.baidu.com/you289065406/home我的金山网盘:http://www.kuaipan.cn/register/?invite=evpga1


相关阅读:
Top