P1015 [NOIP1999 普及组] 回文数

王利润 2021-02-23 04:00:58
楼主的代码可编译,并且,输入第一组测试数据后的输出,和正确答案的输出是一样的。
但是四组测试数据全部是wrong answer。
希望有大神可以帮忙看下,跪谢orz
第一组测试数据:
2
10011



题目如下:

题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。

例如:给定一个十进制数 56,将 56 加 65(即把 56从右向左读),得到 121 是一个回文数。

又如:对于十进制数 87:

STEP1:87+78=165
STEP2:165+561=726
STEP3:726+627=1353
STEP4:1353+3531=4884
在这里的一步是指进行了一次 N 进制的加法,上例最少用了 4 步得到回文数 4884。

写一个程序,给定一个 N(2≤N≤10 或N=16)进制数 M(100 位之内),求最少经过几步可以得到回文数。如果在 30 步以内(包含 30 步)不可能得到回文数,则输出 Impossible!。

输入格式
两行,分别是 N,M。

输出格式
如果能在 30 步以内得到回文数,输出格式形如 STEP=ans,其中 ans 为最少得到回文数的步数。

否则输出 Impossible!。


楼主代码如下:
#include<stdio.h>
int judge(int *p,int bit);
int main()
{
int n;
scanf("%d\n",&n);
char ch;
int i=0,j,carry=0;//计数器i,j和余数carry
int a[200],b[200];
while((ch=getchar())!='\n')
{
if (ch>='0'&&ch<='9') a[i++]=ch-'0';
else a[i++]=ch-'A'+10;
}//循环结束后a[i-1]即为最后一个数
for(j=0;j<=i-1;++j)
b[j]=a[i-j-1];//将a颠倒
if(judge(a,i))//如果输入回文数,那么输出步数为0.
printf("STEP=0\n");
else
{
int c[200],bit=i,ans=0; //有i位,但是,注意数组首位是[0];
while(1)
{
for(j=0;;j++)
{
c[j]=(a[j]+b[j]+carry)%n;
if(a[j]+b[j]+carry>=n)//判断是否有进位
carry=1;
else
carry=0;
if(j==bit-1)//如果到了最后一位
{
if(carry==1)
{
bit+=1;//位数加1;
c[bit-1]=1;//首位进1
carry=0;//余数清零
}
break;
}

}
++ans;//步数加1
if(judge(c,bit))//判断是否是回文数
{
printf("STEP=%d\n",ans);
return 0;
}
if(ans>30)//如果步数大于30
{
printf("Impossible!\n");
return 0;
}
for(j=0;j<=bit-1;j++)//重定义abc
{
a[j]=c[j];
b[bit-j-1]=c[j];
}

}


}

return 0;
}
int judge(int *p,int bit)//判断是否是回文数
{
int i;
for(i=0;i<=bit-1;i++)
{
if(p[i]!=p[bit-1-i])
return 0;
}
return 1;
}


...全文
329 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
forever74 2021-02-23
  • 打赏
  • 举报
回复
我看到,有可能会输出STEP=31
qzjhjxj 2021-02-23
  • 打赏
  • 举报
回复
第44行这里有漏洞,当ans=31的时候仍然输出,修改为:
if(judge(c,bit) && ans<=30 )//判断是否是回文数
lin5161678 2021-02-23
  • 打赏
  • 举报
回复
哦 我看错 if (ch>='0'&&ch<='9') a[i++]=ch-'0'; else a[i++]=ch-'A'+10; 有做特殊处理
lin5161678 2021-02-23
  • 打赏
  • 举报
回复
超过十进制 你的算法就出错
lin5161678 2021-02-23
  • 打赏
  • 举报
回复
c[j]=(a[j]+b[j]+carry)%n; 如果输入是十六进制你就错了 a[j] 是 'a' 你计算 ( 'a'+'a' )%16 ?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧