题目描述
https://www.luogu.org/problemnew/show/P1618
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意
输入输出格式
输入格式:
三个数,A B C。
输出格式:
若干行,每行3个数字。按照每行第一个数字升序排列。
输入输出样例
输入样例#1: 复制
1 2 3
输出样例#1: 复制
192 384 576
219 438 657
273 546 819
327 654 981
说明
保证A<B<C
简便版:
#include<stdio.h>
int main(){
int s[10],a,b,c,i,j,num,book=0;
scanf("%d %d %d",&a,&b,&c);
for(i=123;i*c/a<=987;i++){
for(j=1;j<=9;j++)
s[j]=0;
num=0;
s[i/100]=s[i/10%10]=s[i%10]=1; //接下来使出现的数字都标记为1;
s[i*b/a/100]=s[i*b/a/10%10]=s[i*b/a%10]=1;
s[i*c/a/100]=s[i*c/a/10%10]=s[i*c/a%10]=1;
for(j=1;j<=9;j++)
num+=s[j]; //统计1~9为1的个数
if(num==9){
printf("%d %d %d\n",i,i*b/a,i*c/a);
book=1; //book标记有没有这样的三个三位数
}
}
if(book==0)
printf("No!!!\n");
return 0;
}
暴力版:
#include<stdio.h>
int main(){
int s[10],i,j,k,a,b,c,t,num1,num2,num3,book=0;
scanf("%d %d %d",&a,&b,&c);
for(i=1;i<=9;i++)
s[i]=0;
for(i=1;i<=9;i++){ //一位一位的增
s[i]=1;
for(j=1;j<=9;j++){
if(i!=j){
s[j]=1;
for(k=1;k<=9;k++){
if(i!=j&&j!=k&&i!=k){
s[k]=1;
num1=i*100+j*10+k;
num2=num1*b/a;
num3=num1*c/a;
if(num2<999&&num2/100<=9&&s[num2/100]==0&&num2/10%10<=9&&s[num2/10%10]==0&&num2%10<=9&&s[num2%10]==0&&num2/100!=num2/10%10&&num2/100!=num2%10&&num2/10%10!=num2%10){
s[num2/100]=1;s[num2/10%10]=1;s[num2%10]=1;
if(num3<999&&num3/100<=9&&s[num3/100]==0&&num3/10%10<=9&&s[num3/10%10]==0&&num3%10<=9&&s[num3%10]==0&&num3/100!=num3/10%10&&num3/100!=num3%10&&num3/10%10!=num3%10){
printf("%d %d %d\n",num1,num2,num3);
book=1;
}
}
}
for(t=1;t<=9;t++)
if(t!=i&&t!=j)
s[t]=0;
}
}
s[j]=0;
}
s[i]=0;
}
if(book==0)
printf("No!!!\n");
return 0;
}