洛谷P1618 三连击(升级版)C语言 暴力枚举 详解

本文介绍了一道算法题目,要求将1至9这九个数字分成三组构成三个不同的三位数,使得这三个数的比例符合给定的比例。文章提供了一个简洁的C语言实现方案,通过枚举第一个数并根据比例计算出其它两个数来解决问题。

题目描述

将 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<C。

思路简洁:

可以通过枚举第一个数字,通过确定的比例算出另外两个数字(不一定是存在的),通过检查和判断,筛选出符合要求的答案。这样便极大的降低算法的复杂度。

#include<stdio.h>
#include<stdlib.h>
int s[10];
void go(int x) {//利用数组的下标自然有序将三组数字的每一位数对应的下标的值赋值为1
	s[x % 10] = 1;
	s[x / 10 % 10] = 1;
	s[x / 100 % 10] = 1;
}
int check(int a,int b,int c){//check函数用来检查三组数字是否满足需求
	memset(s, 0, sizeof(s));//清0数组
	if (b > 999 || c > 999)return 0;//显然b和c可能不是三位数,此种情况直接return 0
	go(a), go(b), go(c);
	for (int i = 1; i <= 9; i++) {//下标从1到9遍历,如果三组数字满足每一位数各不相同最终便会结束循环return 1 否则return 0
		if (!s[i])return 0;
	}
	return 1;

}
int main(){
	long  a, b, c, i,t1,t2; 
	int cnt = 0;
		scanf("%ld %ld %ld", &a, &b, &c);//录入比例
		for (i = 123; i <= 987; i++) {//只枚举一个数,借此数和比例暂时求出另外两个数字(可能不存在)
			//因为要求每组三位数数字的每一位数字都不同,此数的范围显然是123-987
			if (i * b % a || i * c % a)continue;// 如果i*b%a或者i*c%a不为0,即除不断,那么由i*b/a算出来的数显然是不符合要求饿
			t1 = i * b / a;
			t2 = i * c / a;
			if (check(i, t1, t2)) {
				printf("%ld %d %d\n", i, t1, t2); cnt++;

		}

	}
		if (!cnt)printf("No!!!");
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Prudento

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值