zoukankan      html  css  js  c++  java
  • POJ2602Superlong sums

    转载请注明出处:優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 }
  • 相关阅读:
    A
    博弈论
    K
    快速幂
    基数排序
    计数排序
    KMP求字符串最小循环节
    二分图多重匹配
    hdu2818行列匹配+排序
    二分图行列匹配与最大匹配必须边
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2121410.html
Copyright © 2011-2022 走看看