Description - 问题描述
有一天,雄霸传授本人风神腿法第一式:捕风捉影..............的步法(弟子一:堂主,你大喘气呀。风:你给我闭嘴。)捕风捉影的关键是换气(换不好就会大喘气...)。
使用捕风捉影这一招时并不是每一步都喘气,而是在特定的步数喘气。一般来说功力越高,喘气越稀疏。喘气的步数符合特定规律:第一要是SUSHU(弟子二:哇塞!堂主,你还会鸟语,我好好崇拜你呦!可是SUSHU是什么意思呢?风:笨蛋,那是汉语拼音!)第二要是一个回文数,回文数就是正反念一样的数,如:123321,121,5211314(弟子三:堂主,最后一个好象不是...风:废话,当然不是了,我是考察一下你们的纠错能力!)现在给出两个数M,N(5< =M< N< =100,000,000),你要算出M,N之间需要换气的都有哪几步。(包括M,N)。算出来的可以提升为本堂一级弟子,月薪(1000000000000000000000000000000000000000000 MOD 10 )元。
可能在众位神犇看来这是一道水的不能再水的题目,但我认为还是有必要提一提的。首先,这是一道判断素数+回文数的题,对于回文数,百度的定义是如下的:
“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数(palindrome number)。
设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。
另外,他给出的c++判定代码如下:
#include<iostream>
using namespace std;
bool symm(long m)
{
long temp = m,n=;
while (temp)
{
n = n*+temp%;
temp = temp/;
}
return (m == n);
}
int main(int argc, _TCHAR* argv[])
{
long m;
cout<<"请输入一个整数:";
cin>>m;
cout<<"输入了"<<symm(m)<<"个回文数!";
return ;
}
个人认为,对于回文数的判断基本可用该法进行。但同时亦可以string读入,用s.size()判断是奇是偶,后再从中向左向右搜索即可。
我的代码:
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=;
//int p[maxn];
int m,n;
//int sum=0;
//void make()
//{
// p[1]=1;
// for(int i=2;i<=sqrt(maxn);i++)
// if(p[i]==0)
// for(int j=2;j<=sqrt(maxn)/i;j++)
// p[i*j]=1;
//}
bool pd_1(int m)
{
int temp=m,n=;
while(temp)
{
n=n*+temp%;
temp/=;
}
return (m==n);
}
//bool pd_2(int m)
//{
// if(p[m])
// return false;
// else
// return true;
//}
bool pd_2(int m)
{
for(int i=;i<=sqrt(m);i++)
{
if(m%i==)
return false;
}
return true;
}
bool pd_3(int m)
{
int k=m%;
if((k==||k==||k==||k==||k==||k==)&&(m/>=))
return false;
else
return true;
}
int main()
{
// make();
cin>>m>>n;
if (n>)
n=;
for(int i=m;i<=n;i++)
{
if(pd_1(i)&&pd_3(i))
if(pd_2(i))
cout<<i<<endl;
}
return ;
}
/**************************************************************
Problem: 1109
User: lwq
Language: C++
Result: Accepted
Time:559 ms
Memory:1320 kb
****************************************************************/