2012-06-03 56 views
-3

我试图做这个问题,但我无法得到它接受,它的输入是很大的,所以我想用字符串,但我仍然得到错误的答案。 问题的陈述是在这里 BISHOPSbishops给出错误的答案(spoj)

这里是我的代码:

#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; 
} 

的问题是要找到最大不易受攻击的主教为N×N的国际象棋棋盘的问题,我认为我是正确的做,因为除了1x1的每一个oyher棋盘最大非attacakable主教将是2 * N-2.but仍然SPOJ是给错误的答案

+3

“球体在线裁判 - 需要授权”。你究竟想达到什么目的? – Zeta

+0

你知道吗,你可以很容易地从'istream'(如cin)中提取数字吗?请使用'cin >> y'而不是逐字逐句的方式。您也可以尝试使用回溯方法。 – Zeta

+0

但问题说要采取10^100,我认为我不能采取与cin –

回答

2

你有整数溢出超过INT_MAX大所有输入:

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

您试图将输入转换为int,通常为带符号的32位类型,其中INT_MAX等于2147483647 = 2 -1。每当输入大于该值时,第十位数字就会溢出(顺便提一句,这是未定义的行为)。

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

+0

仍然我不dont得到如何解决它我已经通过很多方法解决了我,但仍然没有得到正确的答案 –

+0

你如何处理数字?如果你的公式是正确的,得到错误答案的唯一方法就是处理错误的数字。 –