三连击升级版

这篇博客介绍了两种C++算法,用于解决将1到99的数字分成三组,形成三个三位数,使得这三个数的比例符合给定的比例A:B:C。算法包括枚举法和全排列法,确保每个数字只用一次,并检查比例是否满足条件。文章还提供了输入输出样例和代码实现。
摘要由CSDN通过智能技术生成

题目描述

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

//感谢黄小U饮品完善题意

输入格式

三个数,A,B,CA,B,C。

输出格式

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

输入输出样例

输入 #1复制

1 2 3

输出 #1复制

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

说明/提示

保证 A<B<CA<B<C。

做法一:枚举第一个数的所有可能,利用公式推出另外两个数,再利用数组标记出现次数来对比

#include<bits/stdc++.h>
using namespace std;
int a , b , c , y , z , ans;
int book[10];
void f(int x){
	book[x % 10]++;
	book[x / 10 % 10]++;
	book[x / 100]++;	
}
bool check(int x , int y , int z){
	memset(book , 0 , sizeof(book));
	f(x); f(y) ; f(z);
	for(int i = 1 ; i <= 9 ; i++) 
		if(!book[i]) return false;
	return true;
}
int main(){
	scanf("%d %d %d" , &a , &b , &c);
	for(int i = 123 ; i <= 987 ; i++){
		if(i * b % a || i * c % a) continue;//b / a = x / i     x = i * b / a;
		y = i * b / a ; z = i * c / a;
		if(check(i , y , z)) {printf("%d %d %d\n" , i  , y , z); ans++;}
	}
	if(!ans) printf("No!!!");
	return 0;
}

做法二:利用next_permutation来枚举所有9个数的全排列,找到满足比例的排列

#include<bits/stdc++.h>
using namespace std;
int a , b , c , x , y , z , ans;
int arr[11];
int main(){
	scanf("%d %d %d" , &a , &b , &c);
	for(int i = 1 ; i <= 9 ; i++) arr[i] = i;
	do{
		x = arr[1] * 100 + arr[2] * 10 + arr[3];
		y = arr[4] * 100 + arr[5] * 10 + arr[6];
		z = arr[7] * 100 + arr[8] * 10 + arr[9];
		if(x * b == y * a && y * c == z * b)
			printf("%d %d %d\n" , x , y , z) , ans++;
	}while(next_permutation(arr + 1 , arr + 10));
	if(!ans) cout << "No!!!";
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值