2015-10-31 64 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

原來的約束是錯誤的。他們解決了這個問題。 –