主教给错了答案(spoj)

时间:2012-06-03 13:20:16

标签: c++ c

我试图解决这个问题,但是我无法接受它,它的输入很大,所以我想用字符串来接受它,但我仍然得到了错误的答案。 问题陈述在这里 BISHOPS

这是我的代码:

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

using namespace std;

int main()
{
    string s;
    int z;
    cin>>s;
    z = s.length();
    int i;
    vector<int>v;
    int arr[z];
    for(i=0;i<z;i++)
    {
        arr[i] = (s[i]-'0');
    }

    if ((arr[0] == 0 || arr[0] ==  1) && z == 1)
    {
        printf("%d",arr[0]);
    }
    else
    { 
        int carry = 0;
        for(i=z-1;i>=0;i--)
        {
            int x = (carry + 2*arr[i])%10;
            v.push_back(x);
            carry = ( 2*arr[i] )/10;
        }
        if(carry > 0)
        {
            v.push_back(carry);
        }

        int t = v.size();
        int g=0;
        if(v[g] >=2)
        {
            v[g] = v[g]-2;
        }
        else
        {
            v[g] = 8;
            g++;
            while(v[g] == 0)
            {
                v[g] = 9;
                g++;
            }
            v[g] = v[g] -1;
        } 


        if(v[t-1] == 0)
        {
            for(i=t-2;i>=0;i--)
                {
                    printf("%d",v[i]);
                }
        }
        else
        {
            for(i=t-1;i>=0;i--)
            {
                printf("%d",v[i]);
            }
        }
    }

        return 0;
}

问题是在nxn棋盘问题中找到最大的不可攻击的主教,我想我做得对,因为除了每个oyher国际象棋棋盘的1x1最大不可接受的主教将是2 * n-2但仍然是spoj是给出错误的答案

1 个答案:

答案 0 :(得分:2)

对于大于INT_MAX的所有输入,您都有整数溢出:

int y=0,i,z;
z = s.length();
for(i=0;i<z;i++)
{
    y = y*10 + (s[i]-'0');
}

您正尝试将输入转换为intINT_MAX通常是带符号的32位类型,{{1}}等于2147483647 = 2 31 -1。每当输入大于那个时,在第十个数字处就会溢出(顺便说一下,这是未定义的行为)。

您需要一种方法来表示/处理大于10的数字,最多10 100 。 C或C ++中没有标准整数类型足以处理它。你必须滚动你自己的大整数类型(因为SPOJ可能不会将代码与GMP链接)。对于这个问题,非常简单的东西就足够了。