2015-10-31 66 views
1

问题:给定数字k,找出k个正数大整数。 这是我的代码,它的工作原理,但我们的在线裁判拒绝它,segfault说。它为什么显示段错误?我可以用两个字符串来完成,但为什么这不起作用?找到n个大数字的总和

#include <iostream> 
#include <string.h> 

using namespace std; 

void add(int l,int k); 

void append(char a[], int temp); 

int o; 

int tf=0; 

int carry=0; 

char b[1000000]; 

char a[10000][10000]; 

char c[1000000]; 

int main() 
{ 
    int k,x=0,l=0,m=0; 
    cin>>k; 
    while(x<k) 
    { 
     cin>>a[x]; 
     if(strlen(a[x])>l) 
     { 
      l=strlen(a[x]); 
     } 
     x++; 
    } 
    x=0; 
    while(x<k) 
    { 
     if(strlen(a[x])<l) 
     { 
      int temp=0; 
      append(a[x],l-strlen(a[x])); 
     } 
     x++; 
    } 
    add(l,k); 
    if(carry!=0) 
    { 
     cout<<carry; 
    } 
    while(o>=0) 
    { 
     cout<<(int)b[o]; 
     o--; 
    } 
} 

void add(int l,int k) 
{ 
    int lb=l-1; 
    int r=k-1; 
    int sum=0; 
    int x=0; 
    int neg=0; 
    while(lb>=0) 
    { 
     r=k-1; 
     sum=0; 
     while(r>=0) 
     { 
      sum=sum+a[r][lb]-48; 
      r--; 
     } 
     sum=sum+carry; 
     lb--; 
     if(sum>=10) 
     { 
      b[x]=sum%10; 
      carry=sum/10; 
     } 
     else 
     { 
      b[x]=sum; 
      carry=0; 
     } 
     sum=0; 
     o=x; 
     x++; 
    } 
} 

void append(char a[], int temp) 
{ 
    int l=0,m; 
    int tempb=temp; 
    m=strlen(a)-1; 
    while(temp>0) 
    { 
     c[l]='0'; 
     l++; 
     temp--; 
    } 
    int z=0; 
    while(z<=m) 
    { 
     c[l]=a[z]; 
     z++; 
     l++; 
    } 
    z=0; 
    while(z<=m+tempb) 
    { 
     a[z]=c[z]; 
     z++; 
    } 
} 

输入格式: 第一行包含K,指定大号码的数量。接下来的k行中的每一行都包含一个大正整数 。 输出格式: 对于每个测试用例打印一个新行

Sample Input: 
3 
1331331 
1313 
453535322 
Sample Output: 
454867966 

Constraints: 
1<=k<=10 
1<=number of digits in big numbers<=10000 
+0

因为你在处理数字,为什么你需要一个2d字符数组'''? – Nandu

+0

@Nandu好吧,他可以用字符串... – user463035818

+0

这只意味着你的裁判使用了一个测试用例,以你的测试用例没有的方式推动限制 - 可能是一个更大的值 – Peter

回答

1

基于问题陈述了新的大整数

  • 每个输入条目我有最多n 最大 = 10000数字
  • 由于每个条目都存储为C型,零终止字符串,因此每个字符数组的长度必须为(最大为 + 1)= 10001个字符,以适应C字符串终止或'\ 0'。

当你存储的条目入字符数组不留空间零终止子,假设每个条目为10000个字符长:

  • 具有k的每个条目> = 1覆盖了终止符或条目ķ -1,从而将条目合并在一起;
  • 因此,您以一个巨大的字符串结尾,其中l = strlen(a [0])= 100000;
  • 从那时起,所有进一步的处理都是使用这些不正确的(合并的)输入和长度来执行的,导致在执行后期的某个时间点缓冲区溢出。
+1

原来的约束是错误的。他们解决了这个问题。 –