时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
如果一个数字从左边读和从右边读一样,那么这个数字就是一个回文数。例如32123就是一个回文数;17在某种意义上也是一个回文数,因为它的二进制型式——10001——是一个回文数。
请你帮忙开发一个程序,判断一个数n在任意进制(2-16)下是否有回文数。
输入描述:
输入包含多组数据。
每组数据包括一个正整数n (1≤n<2^31)。
输出描述:
对应每组数据,如果n在2-16进制下存在回文数,则输出“Yes”;否则输出“No”。
输入例子:
32123
17
输出例子:
Yes
Yes
我的错误思路,虽说不知道为啥错了
#include<stdio.h>
int turnTo(int n,int r,int arr[]){
int sum = 0,i = 0;
while(n>=r){
arr[i] = n%r;
n = n/r;
i++;
}
arr[i] = n;
sum = i;
return sum;
}
int ifIt(int num,int arr[]){
int i = 0,numm = num-1;
while(i<numm){
if(arr[i]!=arr[numm]){
return 0;
}
i++;
numm--;
}
return 1;
}
int main(){
int n;
int arr[10000],num,flag = 0;
while(scanf("%d",&n)!=EOF){
flag=0;
for(int i = 2;i<=16;i++){
num = turnTo(n,i,arr);
if(ifIt(num,arr)==1){
printf("Yes\n");
flag = 1;
break;
}
}
if(flag==0){
printf("No\n");
}
}
return 0;
}大佬的思路
#include <stdio.h>
int Switch(int a, int b, int *ar);
int IsPilin(int *a, int len);
int main() {
int i;
int len;
int n;
int a[10000];
int res;
int flag;
while(scanf("%d", &n)!=EOF)
{
flag = 0;
for(i=2;i<17;i++) {
len = Switch(n, i, a);
res = IsPilin(a, len);
if(res==1) {
printf("Yes\n");
flag = 1;
break;
}
}
if(flag==0)
{
printf("No\n");
}
}
return 0;
}
int Switch(int a, int b, int *ar)
{
int i = 0;
while(a!=0) {
ar[i] = a % b;
i++;
a /= b;
}
return i;
}
int IsPilin(int*a, int len)
{
int low = 0;
int high = len-1;
int flag = 1;
while(low<high) {
if(a[low]!=a[high]) {
flag = 0;
break;
} low++;
high--;
}
return flag;
}

京公网安备 11010502036488号