首先
在下面的关系式中:
P = 100000x + 10000y + 1000z + 100z + 10y + x
P = 100001x + 10010y + 1100z
P = 11 * (9091x + 910y + 100z)
我们可以得出一条重要结论:凡是回文数都能够被11整除。
其次
两个做大的三位数相乘最大是:999 *999 =998001;所以两个三位数相乘得到的最大的回文数不会超过998001,采取暴力做法,从998001递减遍历,减少循环次数
之后是回文数,回文数由于其数的特点,可以采取取位比较判断来产生,个数不会超过900个,存入数组中。
最后
采取暴力寻找的方法,因为数组中的数是从大到小存入的,所以遍历时第一层for是从0开始,后面的两层for是模拟两个三位数相乘,都从999开始,循环结束条件设置到900,减少循环的次数。
(还有其他的答案,暴力还是好理解吧)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int r=0;
long int array[1010];
for (long int i = 998001; i >= 100000 ; --i ) {
int k=i / 1000 % 10;
int m=i /100 % 10;
int o=i / 100000;
int p= i % 10;
int u=i / 10000 % 10;
int w= i / 10 % 10 ;//取位比较
if(i % 11 == 0 && k==m && o==p && u==w){
array[r]=i;
r++;
}
}//暴力
for (int n = 0; n <= 1010 ; ++n) {
for (int i = 999; i >= 900 ; --i) {
for (int k = 999; k >= 900 ; --k) {
if(i*k == array[n]){
cout<<array[n]<<endl;
}
}
}
}
return 0;
}
一开始想用long long 转换 成 string 来处理回文数的,未果QAQ
string ltos(long long int l)
{
ostringstream os;
os<<l;
string result;
istringstream is(os.str());
is>>result;
return result;
}