每日一题:3.24

P558. 回文平方

 样例

输入数据 1

10

输出数据 1

1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696

输入数据 2

12

输出数据 2

1 1
2 4
3 9
11 121
22 484
101 10201
111 12321
121 14641
12B 16661
131 16B61
202 40804
204 41414

数据范围

2≤ B ≤ 20

对于大于 9 的数字,用 A表示 10,用 B 表示 11,以此类推。

分析:

1、这个题需要考虑两点:一是进制之间的转换,二是判断数的平方是否为回文数(即数字成对称状)

2、进制转换:十进制转化成其他进制:短除法

                        其他进制转化成十进制:秦九韶算法

                        其他进制转化成其他进制:十进制过渡+ 短除法

3、思路:暴力枚举

枚举从1到300,首先将 n 转化为对应进制,其次再每次检查i^{2}在b进制中是否回文数

4、思路:打表

因为1~300也不是不能一个个算出来的,所以本题还可打表,但是打表就失去了这个题的意义,还是要学会进制转换以及回文数的判断的,但凡数据大点,亦或是随机输入一个范围,就难了。

完整代码如下:

暴力枚举:不会写,借鉴的是题解 (T_T)

#include<bits/stdc++.h>
using namespace std;

char get(int x){	// 将数字转为字符
    if (x <= 9) 
		return x + '0';
    return x - 10 + 'A';
}

string base(int n, int b){ //将n转换为 b进制,返回对应字符串(短除法)
    string res;
    while (n){
        res += get(n % b);
        n /= b;
    }
    reverse(res.begin(), res.end());//反转
    return res;
}

bool check(string s){	// 判断是否为回文数 :双指针算法
    for (int i = 0, j = s.size() - 1; i < j; i ++, j -- )	
        if (s[i] != s[j])
            return false;
    return true;
}

int main(){
    int b;
    cin >> b;
    for (int i = 1; i <= 300; i ++ ){	// 暴力
        string num = base(i * i, b);	 // 检查是否为回文数
        if (check(num))
            cout << base(i, b) << ' ' << num << endl;
    }
    return 0;
}

打表:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d",&n);
    if(n==2)printf(
    	"1 1\n"
    	"11 1001"
    );
    if(n==3)printf(
    	"1 1\n"
    	"2 11\n"
    	"11 121\n"
    	"101 10201\n"
    	"102 11111\n"
    	"202 112211\n"
    	"211 122221\n"
    	"1001 1002001\n"
    	"1021 1120211\n"
    	"2002 11022011\n"
    	"10001 100020001\n"
    	"10022 101212101\n"
    	"11012 122111221\n"
    	"12201 1012112101\n"
    	"20002 1100220011\n"
    	"100001 10000200001\n"
    	"100201 10111011101\n"
	);
    if(n==4)printf(
    	"1 1\n"
    	"11 121\n"
    	"101 10201\n"
    	"111 12321\n"
    	"1001 1002001\n"
    	"1013 1032301\n"
    	"1103 1223221\n"
    	"10001 100020001\n"
    	"10101 102030201\n"
    	"10121 103101301\n"
	);
    if(n==5)printf(
    	"1 1\n"
    	"2 4\n"
    	"11 121\n"
    	"101 10201\n"
    	"111 12321\n"
    	"231 114411\n"
    	"1001 1002001\n"
    	"1111 1234321\n"
	);
    if(n==6)printf(
    	"1 1\n"
    	"2 4\n"
    	"11 121\n"
    	"101 10201\n"
    	"111 12321\n"
    	"204 42424\n"
    	"231 102201\n"
    	"1001 1002001\n"
    	"1111 1234321\n"
	);
    if(n==7)printf(
    	"1 1\n"
    	"2 4\n"
    	"4 22\n"
    	"11 121\n"
    	"13 202\n"
    	"14 232\n"
    	"26 1111\n"
    	"44 2662\n"
    	"55 4444\n"
    	"101 10201\n"
    	"111 12321\n"
    	"121 14641\n"
    	"143 24442\n"
    	"316 134431\n"
    	"404 224422\n"
	);
    if(n==8)printf(
    	"1 1\n"
    	"2 4\n"
    	"3 11\n"
    	"6 44\n"
    	"11 121\n"
    	"13 171\n"
    	"33 1331\n"
   		"101 10201\n"
    	"111 12321\n"
    	"117 14141\n"
    	"121 14641\n"
    	"123 15351\n"
    	"303 112211\n"
    	"333 135531\n"
    	"355 155551\n"
	);
    if(n==9)printf(
    	"1 1\n"
    	"2 4\n"
    	"11 121\n"
    	"22 484\n"
    	"101 10201\n"
    	"111 12321\n"
    	"121 14641\n"
    	"202 40804\n"
	);
    if(n==10)printf(
    	"1 1\n"
    	"2 4\n"
    	"3 9\n"
    	"11 121\n"
    	"22 484\n"
    	"26 676\n"
    	"101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "202 40804\n"
	    "212 44944\n"
    	"264 69696\n"
	);
    if(n==11)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "6 33\n"
	    "11 121\n"
	    "22 484\n"
	    "24 565\n"
	    "66 3993\n"
	    "77 5335\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "202 40804\n"
	    "212 44944\n"
	    "234 53535\n"
	);
    if(n==12)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "11 121\n"
	    "22 484\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "12B 16661\n"
	    "131 16B61\n"
	    "202 40804\n"
	    "204 41414\n"
    );
    if(n==13)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "11 121\n"
	    "22 484\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "131 16B61\n"
	);
    if(n==14)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "11 121\n"
	    "1A 2D2\n"
	    "22 484\n"
	    "35 B3B\n"
	    "BB 9CC9\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "131 16B61\n"
	);
    if(n==15)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "4 11\n"
	    "8 44\n"
	    "C 99\n"
	    "11 121\n"
	    "14 191\n"
	    "22 484\n"
	    "29 6B6\n"
	    "44 1331\n"
	    "51 1AA1\n"
	    "88 4CC4\n"
	    "99 6226\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	    "131 16B61\n"
	);
    if(n==16)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "11 121\n"
	    "22 484\n"
	    "101 10201\n"
	    "111 12321\n"
	    "121 14641\n"
	);
    if(n==17)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "4 G\n"
	    "6 22\n"
	    "C 88\n"
	    "11 121\n"
	    "1B 2C2\n"
	    "22 484\n"
	    "4G 1771\n"
	    "66 2662\n"
	    "101 10201\n"
	);
    if(n==18)printf(
	    "1 1\n"
	    "2 4\n"
	    "3 9\n"
	    "4 G\n"
	    "11 121\n"
	    "22 484\n"
	    "2D 777\n"
	    "3B D0D\n"
	);
    if(n==19)printf(
    	"1 1\n"
    	"2 4\n"
    	"3 9\n"
    	"4 G\n"
    	"A 55\n"
   		"11 121\n"
    	"22 484\n"
    	"33 9I9\n"
    	"37 B6B\n"
    	"AA 5FF5\n"
    	"BB 7117\n"
    	"D3 9229\n"
	);
    if(n==20)printf(
    	"1 1\n"
    	"2 4\n"
    	"3 9\n"
    	"4 G\n"
    	"11 121\n"
    	"22 484\n"
    	"25 515\n"
    	"33 9I9\n"
    	"DD 9669\n"
	);
	return 0; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值