题目
题目描述
将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
219 438 657
273 546 819
327 654 981
输入输出格式
输入格式
三个数,A B C。输出格式
若干行,每行3个数字。按照每行第一个数字升序排列。输入输出样例
输入样例
1 2 3输出样例
192 384 576219 438 657
273 546 819
327 654 981
说明
保证A<B<C分析
我的方法是枚举所有的三位数然后挨个试。
最暴力做法没有之一的好吧。
满足比例,基数一定是整数。
关键位置(几乎所有位置)全部给出了相关注释。
上代码(码风一如既往)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <ctime>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
bool used[10];
//检查数字是否齐全的
bool check(int,int,int);
//检查函数
bool answer;
//标记是否有答案
int main()
{
int a;
int b;
int c;
//比例
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
//读入
int a1;
int a2;
int a3;
//那三个数
answer=false;
//初始化
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
for(int k=1;k<=9;k++)
{
if(i==j||i==k||j==k)//不可以一样(先看省时间,其实省不省一样)
continue;
a1=i*100+j*10+k;//求出最小的数
int x;//基数
x=a1/a;//求基数
if(a1%x!=0||a!=a1/x)//看看能不能整除,出小数肯定不行啊
continue;
a2=x*b;//求第二个
a3=x*c;//求第三个
if(check(a1,a2,a3)==false)//检查结果
continue;
printf("%d %d %d\n",a1,a2,a3);//输出
answer=true;//标记
}
if(answer==false)//没有
printf("No!!!");
return 0;
}
bool check(int u,int v,int w)
{
memset(used,false,sizeof used);//初始化
if(u/1000!=0)
return false;
if(v/1000!=0)
return false;
if(w/1000!=0)
return false;
//超过1000
int i;
//这个是看数字的
i=u%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//个位
i=u/10%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//十位
i=u/100;
if(used[i]==true||i==0)
return false;
used[i]=true;
//百位
//第一个数
i=v%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//个位
i=v/10%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//十位
i=v/100;
if(used[i]==true||i==0)
return false;
used[i]=true;
//百位
//第二个数
i=w%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//个位
i=w/10%10;
if(used[i]==true||i==0)
return false;
used[i]=true;
//十位
i=w/100;
if(used[i]==true||i==0)
return false;
used[i]=true;
//百位
//第三个数
return true;
}
可以算个数学题。
