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;
    }
}

 

 

posted @ 2020-03-03 12:26  focusDing  阅读(365)  评论(0编辑  收藏  举报