3 条题解

  • 9
    @ 2022-8-6 15:45:14
    #include <iostream>
    using namespace std;
    int n, ans, a[55], cnt;
    bool huiwen(int x)
    {
        int res = 0, num = x;
        while (x)
        {
            res = res * 10 + x % 10;
            x /= 10;
        }
        if (res == num) return true;
        else return false;
    }
    int main()
    {
        cin >> n;
        for (int i = 1; i <= n; i++)
        {
            cnt = 0;//注意cnt每次初始化为0
            if (!huiwen(i)) continue;//十进制下不是回文直接跳过
            int k = i;//保存i
            while (k)
            {
                a[++cnt] = k % 2;
                k /= 2;
            }
            bool flag = true;//注意每次初始化为true
            for (int i = 1; i <= cnt; i++)//由于是++cnt。所以储存进去的下标是1到cnt
            {
                if (a[i] != a[cnt - i + 1]) flag = false;//我们要判断a[1]和a[cnt], a[2]和a[cnt - 1],转换成数学关系就是
                //a[i]和a[cnt - i + 1]
            }
            if (flag)//此时说明二进制下也是回文了
            {
                ans++;
            }
        }
        cout << ans;
        return 0;
    }
    
    • 3
      @ 2022-10-5 17:49:54

      嗨害嗨,我又来了! 今天给大家讲讲进制回文。 既然老师讲了C++的做法,那我就给大家看看Python的做法(理解了思维就可以套进去) 既然要求在10进制和2进制下都是回文数,那么我们只需套用回文数的定义即可:若数a正着写反着写一样,数a就是回文数。如4554倒着写也是4554,它就是回文数。而a是几进制都无所谓。 回到问题上,只要我们依次枚举范围内的每一个数,再判断是否在10进制和2进制下都是回文数即可。 上代码!

      def check_str(string):
          #求回文数的时候忽略进制,方法通用,所以可以当做函数。
          #string就是str(字符串)
          suoying=len(string)
          copy_string=''
          for i in range(suoying-1,-1,-1):#倒求回文
              copy_string+=string[i]
          if copy_string == string:#回文==原数?
              return True
          return False#return会直接结束函数,无论后面有无return指令 
      a=int(input())
      S=0
      for i in range(1,a+1):
          b=bin(i)
          bs=b[2:]
          #pyhton中bin()会得到以0b开头的数,所以要切片来去除'0b'。
          p=str(i)
          if check_str(bs) and check_str(p):
              S+=1
      print(S)
      
      • 1
        @ 2023-11-9 14:51:45

        #include <iostream> #include <algorithm> #include <math.h> #include <string> using namespace std; string str1, str2; int n, ans; //判断回文数(字符串) bool isPalindrome(string str) { for(int i = 0; i < str.size() / 2; i++) { if(str[i] != str[str.size() - 1 - i]) { return false; } } return true; } //数字转十进制字符串 string toDecimalism(int x) { char c[1001] = {0}, t[1001] = {0}; int i = 0, j = 0; while(x) { c[i++] = (x % 10) + '0'; x /= 10; } while(i) { t[j++] = c[--i]; } return t; } //数字转二进制字符串 string toBinary(int x) { char s[1001] = {0}, c[1001] = {0}; int i = 0, j = 0; while(x) { s[i] = x % 2 + '0'; i++; x /= 2; } while(i) { c[j++] = s[--i]; } return c; } int main() { cin >> n; for(int i = 1; i <= n; i++) { str1 = toDecimalism(i); str2 = toBinary(i); if(isPalindrome(str1) && isPalindrome(str2)) { ans++; } } cout << ans; return 0; }

        • 1

        信息

        ID
        1981
        时间
        1000ms
        内存
        256MiB
        难度
        1
        标签
        (无)
        递交数
        273
        已通过
        180
        上传者