洛谷P1618 三连击(升级版)

这篇博客详细介绍了洛谷P1618的题目描述、输入输出格式,并提供了输入输出样例及解题分析,帮助读者理解并解决这个算法问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。

输入输出格式

输入格式

三个数,A B C。

输出格式

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

输入输出样例

输入样例

1 2 3

输出样例

192 384 576
219 438 657
273 546 819
327 654 981

说明

保证A<B<C

分析

我的方法是枚举所有的三位数然后挨个试。
最暴力做法没有之一的好吧。
满足比例,基数一定是整数。
关键位置(几乎所有位置)全部给出了相关注释。
上代码(码风一如既往)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

bool used[10];
//检查数字是否齐全的 
bool check(int,int,int);
//检查函数 
bool answer;
//标记是否有答案 
int main()
{
	int a;
	int b;
	int c;
	//比例 
	scanf("%d",&a);
	scanf("%d",&b);
	scanf("%d",&c);
	//读入 
	int a1;
	int a2;
	int a3;
	//那三个数 
	answer=false;
	//初始化 
	for(int i=1;i<=9;i++)
		for(int j=1;j<=9;j++)
			for(int k=1;k<=9;k++)
			{ 
				if(i==j||i==k||j==k)//不可以一样(先看省时间,其实省不省一样) 
					continue;
				
				a1=i*100+j*10+k;//求出最小的数 
				
				int x;//基数 
				
				x=a1/a;//求基数 
				
				if(a1%x!=0||a!=a1/x)//看看能不能整除,出小数肯定不行啊 
					continue;
				
				a2=x*b;//求第二个 

				a3=x*c;//求第三个 
					
				if(check(a1,a2,a3)==false)//检查结果 
					continue;
					
				printf("%d %d %d\n",a1,a2,a3);//输出 
				
				answer=true;//标记 
			}
	
	if(answer==false)//没有 
		printf("No!!!");
	
    return 0;
}

bool check(int u,int v,int w)
{
	memset(used,false,sizeof used);//初始化 
	
	if(u/1000!=0)
		return false;
	if(v/1000!=0)
		return false;
	if(w/1000!=0)
		return false;
	//超过1000 
	int i;
	//这个是看数字的 
	i=u%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//个位 
	i=u/10%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//十位 
	i=u/100;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//百位
	//第一个数 
	i=v%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//个位 
	i=v/10%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//十位 
	i=v/100;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//百位 
	//第二个数 
	i=w%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//个位 
	i=w/10%10;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//十位 
	i=w/100;
	if(used[i]==true||i==0)
		return false;
	used[i]=true;
	//百位 
	//第三个数
	return true;
}
可以算个数学题。 偷笑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值