进制回文数
时间限制 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; }