查找n个大数的总和

时间:2015-10-31 20:59:00

标签: c++ arrays

问题:给定数k,求k正大整数之和。 这是我的代码,它有效,但我们的在线评委拒绝它,segfault说。为什么会显示段错误?我可以用两根弦来做,但为什么这不起作用呢?

#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

1 个答案:

答案 0 :(得分:1)

基于问题陈述:

  • 每个输入条目最多包含n max = 10000位数
  • 由于每个条目都存储为C样式,以零结尾的字符串,因此每个字符数组的长度必须为(n max + 1)= 10001个字符,以适应C-字符串终止符'\ 0'。

当您将条目存储到字符数组中而不为零终止符留出空间时,假设每个条目的长度为10000个字符:

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