B - 学密码学真的得学程序

B - 学密码学真的得学程序
Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu

Description

话说,上次ZYJ同学最终在众位玛丽亚的帮助下搞定了那个神奇的字符串,然后神奇的事情发生了,字符串下面竟然有一个通道,ZYJ满怀激动的走下了通道。然而,不得不说,ZYJ同学是悲剧的,为什么呢,因为他走进了一个进制迷宫(谁让他乱闯的来着。。。。。),进制迷宫里有好多好多密码门。他很沮丧,因为他无法破解密码门的密码。这个时候WL看不下去了,于是降下神通,告诉ZYJ,每个密码门上都有一个数字a,那代表这个密码门是a进制的。密码门的密码即为所有小于等于300(这个300是十进制数)的正整数的平方在a进制下是回文串的所有数的和。密码门的密码是a进制的。用A表示10,B表示11,C表示13。。。。。。。

ZYJ竟然没听懂是什么意思,好吧,举个例子来说,如果a为2,那么所有小于等于300的正整数中只有1和3的平方(分别为1和9)在2进制中为回文串(1的二进制为1,是回文串,9的二进制是1001,也是回文串),所以这个密码门的密码是100(1+3=4,4在2进制下是100);

Input

 

第一行输入一个n代表有n扇门。

接下来的n行,每一行都有一个数字a(1<a<20),代表这扇门为a进制。

Output

 

输入每扇门的密码,每扇门的密码占一行。

Sample Input

2
10
2
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
using namespace std;
char node[19]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I'};
int f;
char s[20];
void turn(int n,int a)
{
    int num;
    num=0;
    while(n/a!=0)
    {
        s[num]=node[n%a];
        num++;
        n=n/a;
    }
    s[num++]=node[n];
    s[num]='\0';
    }
    int huiwen()
    {
        int i,len;
        f=1;
        len=strlen(s);
        for(i=0;i<len/2;i++)
        {
            if(s[i]!=s[len-1-i])
            {
                f=0;
                break;
            }

        }
        return f;
    }
    int main()
    {
        int sum,n,i,a;
        scanf("%d",&n);
        while(n--)
        {
            scanf("%d",&a);
            sum=0;
            for(i=1;i<=300;i++)
            {
                turn(i*i,a);
                if(huiwen())
                {
                    sum+=i;
                }
            }
            turn(sum,a);
            int l=strlen(s);
            for(i=l-1;i>=0;i--)
            {
                printf("%c",s[i]);
            }
            printf("\n");
        }
        return 0;
    }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值