SPOJ:PALIN - 下一个回文:输出错误

时间:2016-12-08 12:20:49

标签: c

以下是我在C中写的“The Next Palindrome”的代码:

#include<stdio.h>

int main(void)
{
    int check(int); //function declaration
    int t,i,k[1000],flag,n;

    scanf("%d",&t); //test cases
    for(i=0; i<t; i++)
        scanf("%d",&k[i]); //numbers

    for(i=0; i<t; i++)
    {
        if(k[i]<=9999999) //Number should be of 1000000 digits
        {
            k[i]++;
            while(1)
            {
                flag=check(k[i]); //palindrome check
                if(flag==1)
                {
                    printf("%d\n",k[i]); //prints if it is palindrome and breaks
                    break;
                }
                else
                    k[i]++; //go to the next number
            }
        }
    }
    return 0;
}

int check(int n)
{
    int rn=0;
    int temp=n;
    while(n!=0)
    {
        rn=rn*10+n%10; //reversing
        n=n/10;
    }
    if(rn==temp) //number is palindrome
        return 1;
    else //number is not a palindrome
        return 0;
}

这是来自SPOJ的初级问题。 我试着在Codeblocks上运行这个代码,它运行得很流畅。 在SPOJ中,为什么显示错误的输出?

1 个答案:

答案 0 :(得分:1)

  

在SPOJ中,为什么它显示错误的输出?

这是一个不错的解决方案,适用于小输入,但由于多种原因,它不会通过SPOJ

要求是:

  

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

     

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

您的计划中哪些要求被破坏了?

1)您的假设是,自那以后只会提供1000个数字进行处理 你宣布了​​

k[1000]
  • 错误,行数在第一行给出。它可能远远超过1000。您必须为数字动态分配存储空间。

<强> 2) 这条线

   if(k[i]<=9999999) 

假设输入小于9999999 - 错误,要求说positive integer K of not more than 1000000 digits意味着更大的数字,例如199999991也必须被接受。

3)声明

  

对于给定的正整数K不超过1000000位

以及警告

警告:输入/输出数据较大,请注意某些语言

让我们得出的结论是,应该期待真正的大数字!

int类型不适合存储这么大的数字。如果数字大于int,则INT_MAX +2147483647将无法保留该值。 (检查C库<limits.h>

那么,如何通过SPOJ挑战?

<强> 提示:

  

可能的解决方案之一 - 对字符串进行操作。