三连击升级版(洛谷-1618)
题目描述 将 1,2,…,91, 2 共 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<stdio.h>
int main()
{
int gcd(int n,int m,int s);
int a,b,c,flag=0,k;
scanf("%d %d %d",&a,&b,&c);k=gcd(a,b,c);
a=a/k;b=b/k;c=c/k;
int i;int bi(int n,int m,int s);
for(i=123;i<990;i++)
{if(gcd(i,b*i/a,c*i/a)!=0){
if(i/gcd(i,b*i/a,c*i/a)==a&&(b*i/a)/gcd(i,b*i/a,c*i/a)==b&&(c*i/a)/gcd(i,b*i/a,c*i/a)==c)
{
if(bi(i,b*i/a,c*i/a)==1){
printf("%d %d %d\n",i,b*i/a,c*i/a);flag++;}
}}
}
if(flag==0)printf("No!!!");
return 0;
}
int bi(int n,int m,int s)
{
int a[11]={0};
while(n!=0)
{
a[n%10]++;
n=n/10;
}
while(m!=0)
{
a[m%10]++;
m=m/10;
}
while(s!=0)
{
a[s%10]++;
s=s/10;
}
int i;
if(a[0]!=0)return 0;
for(i=1;i<=9;i++)
{
if(a[i]!=1)return 0;
}
return 1;
}
int gcd(int n,int m,int s)
{
int i,z=0;
for(i=1;i<=m;i++)
{
if(n%i==0&&m%i==0&&s%i==0)
z=i;
}
return z;
}