我试图解决这个问题,但是我无法接受它,它的输入很大,所以我想用字符串来接受它,但我仍然得到了错误的答案。 问题陈述在这里 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是给出错误的答案
答案 0 :(得分:2)
对于大于INT_MAX
的所有输入,您都有整数溢出:
int y=0,i,z;
z = s.length();
for(i=0;i<z;i++)
{
y = y*10 + (s[i]-'0');
}
您正尝试将输入转换为int
,INT_MAX
通常是带符号的32位类型,{{1}}等于2147483647 = 2 31 -1。每当输入大于那个时,在第十个数字处就会溢出(顺便说一下,这是未定义的行为)。
您需要一种方法来表示/处理大于10的数字,最多10 100 。 C或C ++中没有标准整数类型足以处理它。你必须滚动你自己的大整数类型(因为SPOJ可能不会将代码与GMP链接)。对于这个问题,非常简单的东西就足够了。