洛谷 P1151 子数整数

最近回家了没怎么更。
倒也不是没做事,反而比学校里学的更勤了,语言正在由C过渡到C++,还在类那儿扑腾,还学习了一些Linux的基础知识。
来说这题,这作为简单题,约束挺宽泛的,直接暴力枚举就能过。

#include <iostream>
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 <iostream>
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43873801/article/details/86665049