题目描述
将 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至9这九个数字分成三组构成三个不同的三位数,使得这三个数的比例符合给定的比例。文章提供了一个简洁的C语言实现方案,通过枚举第一个数并根据比例计算出其它两个数来解决问题。
473

被折叠的 条评论
为什么被折叠?



