樓主的代碼可編譯,并且,輸入第一組測驗資料后的輸出,和正確答案的輸出是一樣的。
但是四組測驗資料全部是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;
}
uj5u.com熱心網友回復:
c[j]=(a[j]+b[j]+carry)%n;如果輸入是十六進制你就錯了
a[j] 是 'a'
你計算 ( 'a'+'a' )%16 ?
uj5u.com熱心網友回復:
超過十進制 你的演算法就出錯uj5u.com熱心網友回復:
哦 我看錯if (ch>='0'&&ch<='9') a[i++]=ch-'0';
else a[i++]=ch-'A'+10;
有做特殊處理
uj5u.com熱心網友回復:
第44行這里有漏洞,當ans=31的時候仍然輸出,修改為:if(judge(c,bit) && ans<=30 )//判斷是否是回文數
uj5u.com熱心網友回復:
我看到,有可能會輸出STEP=31轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/262631.html
標籤:新手樂園
上一篇:如何通過插值求取對應的值
下一篇:求大佬幫忙看一下錯在哪里了
