1 条题解

  • 0
    @ 2025-8-6 14:28:39
    #include<bits/stdc++.h>
    using namespace std;
    
    // 全局变量:
    int b;          // 存储用户输入的进制(2-12之间)
    int a[1000];    // 存储转换进制后的各位数字
    char g[12] = {'A','B','C','D','E','F','G','H','I','J','K','L'}; // 大于9的数字用字母表示(10→A, 11→B...)
    
    // 判断函数:检查数字x在b进制下是否是回文数(正着读和倒着读都一样)
    bool judge(int x) {
       int stop = 1;  // 假设是回文数(1表示是,0表示不是)
       int tail = 1;  // 记录数字的位数(从1开始计数)
       
       // 将数字x转换成b进制,存入数组a
       while(x != 0) {
       	  a[tail] = x % b; // 取余数(当前位的数字)
       	  x = x / b;       // 去掉最后一位
       	  tail++;          // 位数增加
       }
       tail--; // 上面循环多加了1,这里减回来
       
       // 检查是否是回文:比较对称位置上的数字
       for(int i = 1; i <= (tail+1)/2; i++) {
       	  if(a[i] != a[tail+1-i]) { // 如果对称位置数字不同
       	     stop = 0;  // 标记不是回文数
    		 break;     // 跳出循环	
    	  }
       }
       
       // 返回判断结果
       if(stop == 1) return true;  // 是回文数
       else return false;          // 不是回文数
    }
    
    // 打印函数:将数字x用b进制表示并打印出来
    void print(int x) {
       int tail = 1; // 记录位数
       
       // 将数字x转换成b进制(和judge函数中相同)
       while(x != 0) {
       	  a[tail] = x % b; // 取余数
       	  x = x / b;       // 去掉最后一位
       	  tail++;          // 位数增加
       }
       tail--; // 修正位数
       
       // 从高位到低位打印(因为转换时是从低位到高位存的)
       for(int i = tail; i >= 1; i--) {
       	  if(a[i] <= 9) 
             cout << a[i];  // 小于等于9直接打印数字
       	  else 
             cout << g[a[i]-10]; // 大于9打印对应字母(10→A, 11→B...)
       }
    } 
    
    int main() {
    	cin >> b; // 输入进制数(2-12之间)
    	
    	// 检查1到300之间的每个数
    	for(int i = 1; i <= 300; i++) {
    		// 如果i的平方在b进制下是回文数
    		if(judge(i*i) == true) {
    		  	print(i);     // 打印原始数i(b进制)
    		    printf(" ");  // 打印空格
    			print(i*i);   // 打印平方数(b进制)
    			printf("\n"); // 换行
    		}
    	}
    	return 0; // 程序结束
    }
    
    • 1

    信息

    ID
    217
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者