【洛谷】P1008 三连击

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

将1,2, \cdots ,91,2,⋯,9共99个数分成33组,分别组成33个三位数,且使这33个三位数构成1:2:31:2:3的比例,试求出所有满足条件的33个三位数。

输入输出格式

输入格式:

 

木有输入

 

输出格式:

 

若干行,每行33个数字。按照每行第11个数字升序排列。

 

输入输出样例

输入样例#1: 复制

输出样例#1: 复制

192 384 576
* * *
...

* * *
(输出被和谐了)

额,这一题只是想到了要把第一个数字a的范围算出来,最小肯定是123,最后一个数最大是987,除以三就是329,那么第一个数字的范围就是123到329,然后表示出b=2a,c=3a,然后分别求出每个数的个位十位百位。到这里我一开始的判断条件是不够完整的,导致数据太多,后来参考大佬的,发现只要他们相乘等于1*2*3*4*5*6*7*8*9即可。

#include
using namespace std;
int main(){
	int a,b,c;
	int agw,asw,abw,bgw,bsw,bbw,cgw,csw,cbw;
	for(a=123;a<329;a++){
		b=2*a;
		c=3*a;
		agw=a%10;
		bgw=b%10;
		cgw=c%10;
		asw=a/10%10;
		bsw=b/10%10;
		csw=c/10%10;
		abw=a/100;
		bbw=b/100;
		cbw=c/100;
		if((agw*asw*abw*bgw*bsw*bbw*cgw*csw*cbw==1*2*3*4*5*6*7*8*9)&&
		(agw+asw+abw+bgw+bsw+bbw+cgw+csw+cbw==45)) 
	    {
			cout<

然后然后,我又在网上参考了一位大佬的代码,发现除了这种暴力的判断,还可以用哈希的思想,新建一个数组x[9]全部值赋为0,然后把这三个数各位一共九个数字,比如,agw=2,那么就把x[awg]=1,这样就表示2已经存在,直至x[10]从x[1]开始每个都为1时,答案就出来了。

#include
#include
using namespace std;
int main(){
	int a,b,c;
	int agw,asw,abw,bgw,bsw,bbw,cgw,csw,cbw;
	int x[10]={0};
	for(a=123;a<329;a++){
		memset(x,0,sizeof(x));
		b=2*a;
		c=3*a;
		agw=a%10;
		bgw=b%10;
		cgw=c%10;
		asw=a/10%10;
		bsw=b/10%10;
		csw=c/10%10;
		abw=a/100;
		bbw=b/100;
		cbw=c/100;
	    x[agw]=1;
	    x[asw]=1;
	    x[abw]=1;
	    x[bgw]=1;
	    x[bsw]=1;
	    x[bbw]=1;
	    x[cgw]=1;
	    x[csw]=1;
	    x[cbw]=1;
	    if(x[1]==1&&x[2]==1&&x[3]==1&&x[4]==1&&x[5]==1&&x[6]==1&&x[7]==1&&x[8]==1&&x[9]==1)
		cout<

 

你可能感兴趣的:(洛谷)