回文数就是形似“12345678987654321”一样金字塔型的数字,是模型题目考察的常客了,许多题目都是基于这个来演变的。下面是例题:
这个程序,分析一下,按照我的水准,就直接当作十位进制来算就好了,于是我就构思了三个模块:
1、回文数的判断 (如果是回文数了,就直接输出0,如果不是就在接着弄下面的函数)
2、将输入的数和逆置之后的数加起来,再判断
3、输出累加的次数。
当然,我想的确实是太简单了,思路应该是对的,不过脑子里装的一些代码或者头文件,确实太少了,下面是我的代码:
#include<iostream>
using namespace std;
int a[100];
int F(int M) {
int N = M, n = 0;
while ((N % 10) != 0) {
a[n] = N % 10;
N = N / 10;
n++;
}
int i = 0;
while (i < n) {
if (a[i] == a[n - 1]) { i++; n--; return 1; }
else { return 0; break; }
}
}
int main()
{
int m, M;
cin >> m >> M;
if (F(M) == 1)cout << "1";
else {
int N = M, n = 0, p = 0, k = 0;
while (F(M) != 1) {
while ((N % 10) != 0) {
a[n] = N % 10;
N = N / 10;
n++;
}
for (int m = 0; m < n; m++) {
k = k * 10 + a[m];
}
M += k;
p++;
}
cout << p;
}
return 0;
}
将每一个数进行判断,然后p每次累加,可是在出结果的时候,这个p比要的数大2,不论输入啥都是这个样子。
于是我只好求助一下题解里面的大佬们,发现了一个巧妙地东西,bool类型。
bool类型就是根据结果的return为true或false来给回归值,return为true就是1,false就是false,和我需要的判断条件是符合的。
题解的判断函数如下:
inline bool pd()
{
for (int i=0;i<l;++i)
if (c[i]!=c[l-1-i]) return false;
return true;
}
使用bool直接返回1或0,再加上下面这个循环,就可以将数加起来了:
while (!pd())
{
++step;
if (step>30) break;
add();
}
add()函数是添加函数。
下面是大佬的所有代码:
#include <cstdio>
#include <cstring>
const int S=303;//一次加法顶多多一位,所以顶多多30位,也就是130位左右。我开大一点,开到300.
int n,a[S],l;
char c[S],d[S];
inline void add()
{
for (int i=0;i<l;++i)
d[l-i-1]=c[i];
l+=2;//可能有进位,所以我们干脆在前面先多空个两位
for (int i=0;i<l;++i)
{
c[i]+=d[i];
if (c[i]>=n) c[i+1]++,c[i]-=n;
}
while (!c[l-1]) --l;//大不了多余的前导0再减回来嘛~~简化思维~~
}
inline bool pd()
{
for (int i=0;i<l;++i)
if (c[i]!=c[l-1-i]) return false;
return true;
}
int main()
{
scanf("%d%s",&n,c);l=strlen(c);
for (int i=0;i<l;++i)
{
if (c[i]>='0' && c[i]<='9') c[i]-='0';
else c[i]=c[i]-'A'+10;
}
int step=0;
while (!pd())
{
++step;
if (step>30) break;
add();
}
if (step<=30) printf("STEP=%d\n",step);
else puts("Impossible!");
return 0;
}
两个字符数组来记录所有可能的位数,n表示进制位,l表示输入的字符个数。
录入每一个字符,对其进行一个判断,如果出现了一个不符合回文数判断的就会判错,接着就会进入到累加的循环,累加之后也要判断是否为回文数,不是的话,如上循环。其中每次的累加之后会接一个记次数的++,当它小于三十且可以变成回文数,就能输出,大于或等于30,就会出“impossible”。