52 回文平方数
问题描述 :
回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2=<B<=20进制),输出所有的大于等于1小于等于300且该数的平方用B进制表示时是回文数的数(该数本身不要求是回文数)。
输入说明 :
共一行,一个单独的整数B(B用十进制表示,比如18)。
输出说明 :
每行两个数字,第二个数是第一个数的平方,且第二个数是回文数。
注意:输出时,这两个数都应该以B进制表示。
在输出时,数字10到20分别以A到K代替。
输入范例:
20
输出范例:
1 1
2 4
3 9
4 G
11 121
22 484
25 515
33 9I9
DD 9669
解答:本题考查字符数组、进制转换、判断回文。结构化函数编程
算法思想:
1、首先解决进制转换的问题
采取除数取余的方法解决(注意存储到字符数组中的内容是倒序的);
核心代码:
void Convert(int num,int b){ int temp; while(num){ temp = num%b; if(temp<10){ res[arrLen++]=temp+48; }else{ res[arrLen++]=temp+55; } num =num/b; } res[arrLen]='\0'; }
这段代码中需要注意的是:
容易犯的错误:忘记加num =num/b;导致陷入死循环。忘记加res[arrLen]='\0';字符数组没有结束标志printf("%s",res);结果混乱
if语句主要是将数字0~9转换为字符形式。
2、然后解决判断回文的问题。
直接对字符数组进行遍历即可。
完整代码如下:
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> int IsHuiWen(int num,int b); void Convert(int num,int b); void Reverse(); char res[20]; int arrLen = 0; int main(){ int b; scanf("%d",&b); int num,i,flag; for(i=1;i<=300;i++){ arrLen = 0; num=i*i; flag=1;//默认是回文数 //printf("------------\n"); flag = IsHuiWen(num,b); arrLen=0; if(flag==1){ Convert(i,b); Reverse(); printf("%s",res); arrLen=0; Convert(num,b); printf(" %s\n",res); } } return 0; } int IsHuiWen(int num,int b){ Convert(num,b); int i=0; int j=arrLen-1; while(i<j){ if(res[i]!=res[j]){ return 0; } i++;j--; } return 1; } void Convert(int num,int b){ int temp; while(num){ temp = num%b; if(temp<10){ res[arrLen++]=temp+48; }else{ res[arrLen++]=temp+55; } num =num/b; } res[arrLen]='\0'; } void Reverse(){ char temp; for(int i=0;i<arrLen/2;i++){ temp=res[i]; res[i]=res[arrLen-1-i]; res[arrLen-1-i]=temp; } }