- C++
求大佬看看为什么错了,题目是p393回文数个数
- 2023-10-29 16:52:52 @
#include<cmath>
using namespace std;
int a[10001];
int ggb(int i);
int main()
{
int n,s=0;
cin>>n;
for(int i=1;i<=n;i++)
{
s+=ggb(i);
}
s=n-s;
cout<<s<<endl;
return 0;
}
int ggb(int i)
{
bool f=true;
int l=1,b=i,pan,k=i;
do
{
a[l]=b%10;
b/=10;
l++;
}while(b!=0);
for(int j=1;j<=l/2+1;j++)
{
if(a[j]!=a[k])
{
f=true;
}
else f=false;
k--;
}
if(f) pan=1;
else pan=0;
return pan;
}
救救孩子!
2 条评论
-
2023lishuhang LV 8 @ 2023-11-5 17:21:25
已经有人指出过错误,我不再过多阐述,但是......代码风格上我个人有点建议
if(f) pan=1; else pan=0; return pan;
建议改为
if (f) return 1; return 0;
另,这种简单题建议用简单方法,不然容易把自己弄晕
-
2023-10-31 20:15:38@
有两处 BUG (问题全部出于《GG-Bond》函数)😄 :
- k 的功能是记录数字 i 的长度,
k=i
只是将 k 赋值为 i。应当分别修改为:int k
和k = --l
,这里 --l 是因为在 do-while 循环中l++
的执行次数为 i 的长度 次,所以 l 的值实际上为 i 的长度+1。 - for 循环 判断字符是否不同 时 当不相同时(执行
if
语句),应当退出循环,否则后面的else
成立时会把 f 重新赋值为true
,影响程序判断。
代码如下:
#include<cmath> #include<iostream> using namespace std; int a[10001]={}; int ggb(int i); int main(){ int n, s=0; cin >> n; for(int i=1; i<=n; i++){ s += ggb(i); } s = n-s; cout << s << endl; return 0; } int ggb(int i){ bool f=true; int l=1, b=i, pan, k; do{ a[l] = b%10; b /= 10; l++; } while(b != 0); k = --l; //修改 1 for(int j=1; j <= l; j++){ //长度判断未优化,lan()() if(a[j] != a[k]){ f = true; break; //修改 2 } else f = false; k--; } if(f) pan = 1; else pan = 0; return pan; }
//话说,这道题用递推解。。不彳亍吗?
#include<cstdio> using namespace std; int main(){ int n, c=0; scanf("%d", &n); for(int i=1; i<=n; i++){ int num=i, index=0; char number[5]={}; while(num >= 10){ number[index++] = num%10+'0'; num /= 10; } number[index++] = num+'0'; bool flag=1; for(int j=0; j<index/2; j++){ if(number[j] != number[index-j-1]){ flag = 0; break; } } if(flag) c++; } printf("%d\n", c); return 0; }
- k 的功能是记录数字 i 的长度,
- 1