acwing回文平方

题目大意

现在给定你一个整数 B,请你判断 1∼300 之间的所有整数中,有哪些整数的平方转化为 B 进制后,其 B 进制表示是回文数字。
输入
一个整数B
输出
每行包含两个在 B 进制下表示的数字。
第一个表示满足平方值转化为 B 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。

#include <iostream>
#include <string.h>
using namespace std;
char arr[20];//存放原数的平方的B进制
char brr[10];//存放原数的B进制
int change(int a, int b, char* arr)//将数字a转换为b进制并存放在数组arr里面
{
    int i = 0;
    char s = 'A';
    while (a)
    {
        char ss = (a % b) + '0';
        if (a % b >= 10)ss = s + (a % b - 10);
        arr[i++] = ss;
        a /= b;
    }
    return i;
}
int judge(int len)//判断存放原数的平方转化为B进制是否为回文数(存放在数组arr里面)
{
    int j = len - 1;
    for (int i = 0; i <= (len - 1) / 2; i++)
    {
        if (arr[i] != arr[j--])
        {
            return 0;
        }
    }
    return 1;
}
void print(char* arr, int len)//打印转为B进制后的数,len为数组长度
{
    for (int j = len - 1; j >= 0; j--)
        cout << arr[j];
}
int main(void)
{
    int n, len;
    cin >> n;
    int sum = 0;
    for (int i = 1; i <= 300; i++)
    {
        memset(arr, 0, sizeof(arr));//清空数组
        memset(brr, 0, sizeof(brr));
        sum = i * i;
        int len = change(sum, n, arr);
        if (judge(len))//如果是回文数
        {
            print(brr, change(i, n, brr));//打印原数
            cout << ' ';
            print(arr, len);//打印原数的平方
            cout << endl;
        }
    }
    return 0;
}

c++string字符串做法

#include <bits/stdc++.h>
using namespace std;
string str = "0123456789ABCDEFGHIGKLMNOPQRSTUVWSYZ";//定义一个字典
string res;
string change(int a, int b)//返回字符串类型
{
    res = "";//每回清空,防止原数和原数平方造成错误
    while (a)
    {
        res.insert(res.begin(), str[a % b]);//将转化后的B进制各位逆向添加到res字符串
        a /= b;
    }
    return res;
}
int judge()
{
    string temp = res;
    reverse(res.begin(), res.end());//字符串倒序判断回文
    if (temp != res)return 0;
    return 1;
}
int main(void)
{
    int n;
    cin >> n;
    for (int i = 1; i <= 300; i++)
    {
        change(i * i, n);
        if (judge())//如果是回文数
        {
            cout << change(i, n) << ' ' << change(i * i, n) << endl;
        }
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值