Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ spoj-julka大数实现_C++ - Fatal编程技术网

C++ spoj-julka大数实现

C++ spoj-julka大数实现,c++,C++,这是我在Spoj解决JULKA问题的方法。 . 问题很简单,给定两个数sum和diff,我们必须找到2个a和b,这样a+b=sum,a-b=diff 和,差在1,10^100之间 在Python中的实现是微不足道的。我试图用数组实现C++。经过几个小时的调试,我得到了我检查的每个测试用例的正确ans 固定测试用例的样本输入数量=10 5 1 4 2 4 0 100 10 还有6个测试用例 样本输出 3. 2. 3. 1. 2. 2. 55 45 有效案例仅包括给出完美整数解的案例。 例如,像1

这是我在Spoj解决JULKA问题的方法。 .

问题很简单,给定两个数sum和diff,我们必须找到2个a和b,这样a+b=sum,a-b=diff 和,差在1,10^100之间

在Python中的实现是微不足道的。我试图用数组实现C++。经过几个小时的调试,我得到了我检查的每个测试用例的正确ans

固定测试用例的样本输入数量=10 5 1 4 2 4 0 100 10 还有6个测试用例

样本输出 3. 2. 3. 1. 2. 2. 55 45

有效案例仅包括给出完美整数解的案例。 例如,像10,3100,15,10,10,20,20,40,50,7,11这样的案例是无效的,不会给出它们

然而,Spoj服务器仍然给出了错误的答案……您能帮我找出它失败的测试用例吗


}/P>< 15 > 8表示如果在C++中使用数组是奇数差异是偶数或是副

@ RSDIB实现。这就是为什么香草C++不是一个好的语言来完成这个任务。除非您已经编写了一个大数字类,测试了它,等等,否则编写这样的东西本身就是一项任务。坚持使用Python或java的BigNeNoP类,或者第三方C++库,处理大数,或者合法地编写自己的类。你好,欢迎使用堆栈溢出,虽然这是问题的答案,你能提供更多的细节,或者你是如何做到这一点的?
#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

int main()
{
int t=10,carry,a[105],b[105],temp[105];
char sum[105],diff[105];

while(t--)
{
    cin>>sum;          // sum and diff accepted as strings
    cin>>diff;
    int i,j,k=0,r;
    for(i=strlen(sum)-1,j=strlen(diff)-1;i>=0,j>=0;i--,j--)  
    {
        if( sum[i] >= diff[j] )  //loop to find sum -diff.Result in temp
            temp[k++]=sum[i]-diff[j];
        else
        {   temp[k++]=10+sum[i]-diff[j];
            r=i-1;
            while(1)
            {

                if(sum[r]=='0')
                {
                    sum[r]='9';
                    r--;
                    continue;
                }
                sum[r]=(char)(sum[r]-1);
                break;
            }
        }
    }
    if(i>=0)        // for digits after diff's msb,we simply pass it to temp 
    {   for(j=i;j>0;j--)
        {
            temp[k++]=sum[j]-'0';
        }
        if(sum[0]!='0')             //if last digit is 0,we don't want it
            temp[k++]=sum[0]-'0';
    }

    //finding the smaller
    j=0;                     // a=(sum-diff)/2
    carry=0;
    for(i=k-1;i>=0;i--)
    {   a[j++]=(temp[i]+10*carry)/2;
        carry=(temp[i]+10*carry)%2; //a msb at 0
    }
    int cnt_a=k;


    //finding bigger

    k=0,i=j-1,r=strlen(diff)-1;  // b=a+diff
    carry=0;
    while(i>=0&&r>=0)           
    {
        b[k++]= (a[i]+(diff[r]-'0')+carry)%10;  //a lsb at j-1,b lsb at 0
        carry=(a[i--]+(diff[r--]-'0')+carry)/10;
    }

    while(i>=0) // if a>diff for digits after diff's msb,we pass it to b
    {   b[k++]= (a[i]+carry)%10;
        carry=  (a[i--]+carry)/10;
    }

    while(r>=0) // if diff>a for digits after a's msb,we pass it to b
    {   b[k++]= ( (diff[r]-'0')+carry)%10;
        carry=  ( (diff[r--]-'0')+carry)/10;
    }
    int cnt_b=k;

    //printing a and b

    if(cnt_b>1)      //printing b

    {   if(b[cnt_b-1]!=0)          //if msb was 0 we don't print it
            printf("%d",b[cnt_b-1]);


        for(i=cnt_b-2;i>=0;i--)
            printf("%d",b[i]);

        printf("\n");
    }
    else if(cnt_b==1) //if only 1 digit we print msb even if it's 0
        printf("%d\n",b[0]);


    if(cnt_a>1)          //printing b

    {   if(a[0]!=0)
            printf("%d",a[0]);   //if msb was 0 we don't print it

        for(i=1;i<cnt_a;i++)
            printf("%d",a[i]);
        printf("\n");
    }
    else if(cnt_a==1)       //if only 1 digit we print msb even if it's 0
        printf("%d\n",a[0]);


}
return 0;