#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 条评论

  • @ 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》函数)😄 :

      1. k 的功能是记录数字 i 的长度,k=i只是将 k 赋值为 i。应当分别修改为:int kk = --l,这里 --l 是因为在 do-while 循环中 l++ 的执行次数为 i 的长度 次,所以 l 的值实际上为 i 的长度+1。
      2. 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;
      }
      
    • 1