回文数就是形似“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”。