最近回家了没怎么更。
倒也不是没做事,反而比学校里学的更勤了,语言正在由C过渡到C++,还在类那儿扑腾,还学习了一些Linux的基础知识。
来说这题,这作为简单题,约束挺宽泛的,直接暴力枚举就能过。
#include
using namespace std;
int main(int argc, char const *argv[])
{
int k;
cin>>k;
bool found=false;
int a1,a2,a3,a4,a5,sub1,sub2,sub3;
for(int i=10000;i<=30000;i++)
{
a1=i/10000;
a2=i/1000%10;
a3=i/100%10;
a4=i/10%10;
a5=i%10;
sub1=100*a1+10*a2+a3;
sub2=100*a2+10*a3+a4;
sub3=100*a3+10*a4+a5;
if(sub1%k==0&&sub2%k==0&&sub3%k==0)
{
cout<<i<<endl;found=true;}
}
if(!found) cout<<"No";
return 0;
}
当然不可能满足于此的,我们可以反向思维,由sub123来生成这个数。因为从规则中可以看到,每一个新数实际上是沿用了前一个的十位和个位作为百位和十位,自己只需要产生个位就可以。而第一个数完全可以从k第一个大于100的倍数来枚举,这样sub1肯定是可以整除的。
#include
using namespace std;
int main(int argc, char const *argv[])
{
int k;cin>>k;
bool found=false;//标志位,是否找到
int num;
int sub1;
for(sub1=k;sub1<100;sub1+=k);//把sub1提到k的第一个大于100的倍数
for(;sub1<=300;sub1+=k)//之后sub1只枚举k的倍数
for(int sub2=(sub1%100)*10;sub2<=(sub1%100)*10+9;sub2++)//sub2继承个位和十位,自己只产生个位
if(sub2%k==0)//如果sub2不能整除也不必生成sub3了
for(int sub3=(sub2%100)*10;sub3<=(sub2%100)*10+9;sub3++)
if(sub3%k==0)
{
num=sub1*100+sub2%10*10+sub3%10;
if(num<=30000) {
cout<<num<<endl;found=true;}//注意一下题目限定的范围
}
if(!found) cout<<"No";
return 0;
}