网上法官拒绝我的答案

时间:2015-03-11 13:15:29

标签: c++ long-integer palindrome

下一个回文

以下代码是此问题的解决方案

如果从左到右和从右到左读取十进制系统中的表示相同,则正整数称为回文。对于给定的正整数K不超过1000000位,写入大于K的最小回文值输出。始终显示数字而不带前导零。

输入

第一行包含整数t,即测试用例的数量。整数K在下一行中给出。

输出

对于每个K,输出大于K的最小回文。

示例

输入: 2 808 2133

输出: 818 2222

#include <iostream>

using namespace std;

int main()
{
 long t;
 cin>>t;
 long a[t],k;
 for(long i=0;i<t;++i)
{

    cin>>k;
    a[i]=k;

}

 for(long i=0;i<t;++i)
 {
    long palin=0,num;
    palin=a[i];
    num=palin+1;

    while(1)
    {
        long x=0,rev=0,ans=num;
        do
        {
            x=ans%10;
            rev=rev*10+x;
            ans=ans/10;
        }while(ans);  
        if(rev==num)
        {
            cout<<"\n"<<rev<<"\n";
            break;
        }    
        else
            ++num;
    }     
 }      
return 0;
}

代码给了我预期的输出,我甚至对代码进行了更改,使变量K和t变为LONG,如果我将它们做多长而不是长,或者我的逻辑有什么问题......?< / p>

2 个答案:

答案 0 :(得分:2)

您可以使用字符串而不是long来编写有效的程序。我用过它。我在这里给出代码:

#include<iostream>

using namespace std;

#include<string.h>

int main()
{
    char s[80];   //you can take any big index instead 80
    gets(s);
    int a=0,l=strlen(s);

    for(int i=0;i<l;i++) {
        if(s[i]==s[l-i]) {
            a++;
        }
    }

    if(a==l) {
        cout<<"Number is palindrome";
    }
    else {
        cout<<"Number is not palindrome";
    }

    return(0);
}

答案 1 :(得分:2)

这个任务真的可以处理高达1,000,000位的整数吗?或输入小于1M?
“long”保证至少为32位长(因此无符号长整数可以保持整数[0,4,294,967,295]。所以如果你的输入是&lt; 1M,你的保险箱只需要常规长。
“long long”保证至少为64位长,因此无符号long long的范围为[0,18x10 ^ 18]。大于4M,但仍远小于1M十进制数字。

您的代码的另一个问题是它看起来像您尝试动态分配堆栈数组。

cin>>t;
long a[t],k;

您无法提供变量作为数组大小。这是C ++的一个非常基本的要点,您必须执行以下操作之一:

  1. 为数组使用一个恒定的编译时最大大小(最简单的解决方案)。

    #define A_MAX_SIZE 100
    long a[A_MAX_SIZE];
    
  2. 使用动态数组(但之后必须分配并删除它) 请参见链接:http://www.cplusplus.com/doc/tutorial/dynamic/

  3. 使用能够为您记忆的STL容器 例如:http://www.cplusplus.com/reference/stl/vector/vector/