2021年下学期《C语言程序设计》作业16-2019年下学期期末考试
Description | ||
回文数题目描述回文数是指一个没有前导0的数,从左到右的数码和从右到左的数码是一样的。比如说10进制下的"121",这就是一个回文数。 我们将这个概念扩展到b进制,n=∑ki=0ai⋅bi,其中0≤ai<b,2≤b,ak>0,如果数列ak,ak−1,…,a0构成一个回文序列,那么就称n在b进制下是回文数。比如,5在2进制下是101(2),所以5在2进制下是回文数。 我们想知道n在b进制下为回文数时,最小的b是多少? 输入第一行是一个整数T(1≤T≤1000),表示样例的个数。 每个样例是一个十进制整数n(1≤n≤106)。 输出依次每行输出一个样例的结果,为一个整数,表示b。 |
这里有几个能够优化的地方:
1、不需要初始化数组。仅需要记录使用的
2、注意题干中有一句“没有前导0”,意思就是说这个数的开头不是0,那么转换之后的数的末尾也就不能是0。
3、局部数组比全局数组快。
#include<stdio.h>
using namespace std;
int main() {
int nn;
scanf ("%d", &nn);
while (nn--) {
int n;
scanf("%d", &n);
for (int i = 2; i <= n + 1; i++) {
int v[21] ;
int t = 0;//位数
int tmp = n;
while (tmp != 0) {
v[t++] = (tmp % i);
if (v[0] == 0) {
break;
}
tmp /= i;
}
bool succespd = 1;
if (v[0] == 0) continue;
for (int j = 0; j < t / 2; j++) {
if (v[j] != v[t - j - 1]) {
succespd = 0;
break;
}
}
if (succespd) {
printf("%d\n", i);
break;
}
}
}
return 0;
}