这就是一篇看完题解之后写后的题解,哈哈哈哈哈哈哈
原题目传送门
题目的大概描
这个题让我们输入三个数a
,b
,c
,使得在三位数中(100
-999
)存在三个数满足我们输入的比例(例如:1
:2
:3
的三位数有192
:384
:576
等),并把它们全部输出出来。
这道题特别像全排列问题,把三位数从头到位生成一边,看看有没有符合我们输入的三个数的比例的三位数。因此,对于我这种新手蒟蒻,肯定会第一时间想到STL中的next_permutation
函数。
开局一条分割线,就问你服不服?(orz
既然是全排列,那么我们就是去排列0-9的所有数字(因为数据本身就不多,使用next_permutation
的空间和时间都是够的),看看从哪些排列里面能够得到我们想要的成比例的三位数。
因为最终我们需要判断的是三位数是否成比例,那么我们就需要把这些数以我们输入的比例乘出来(例如,192
:384
:576
,把192
6
=384
2
=576
*2
,以此来判断,因此我们就需要加上一行特殊的处理)。
a=tmp/a; b=tmp/b; c=tmp/c;
do{
if((100*num[1]+10*num[2]+num[3])*a==(100*num[4]+10*num[5]+num[6])*b && (100*num[1]+10*num[2]+num[3])*a==(100*num[7]+10*num[8]+num[9])*c){
printf("%d%d%d %d%d%d %d%d%d\n",num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
cnt++;
}
} while(next_permutation(num+1,num+10));
最后,如果有排列满足,那么我们就输出这个排列,让计数器++
。如果计数器为0,那么就输出No!!!
,即没有答案。完结撒花。
上代码
#include<bits/stdc++.h>
using namespace std;
int num[10]={0,1,2,3,4,5,6,7,8,9};
int a,b,c,tmp,cnt=0;
int main(){
scanf("%d%d%d",&a,&b,&c);
tmp=a*b*c;
a=tmp/a; b=tmp/b; c=tmp/c;
do{
if((100*num[1]+10*num[2]+num[3])*a==(100*num[4]+10*num[5]+num[6])*b && (100*num[1]+10*num[2]+num[3])*a==(100*num[7]+10*num[8]+num[9])*c){
printf("%d%d%d %d%d%d %d%d%d\n",num[1],num[2],num[3],num[4],num[5],num[6],num[7],num[8],num[9]);
cnt++;
}
} while(next_permutation(num+1,num+10));
if(cnt==0) printf("No!!!\n");
system("pause");
return 0;
}