链接:P1618 三连击(升级版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目:将 1,2,…,9 共 9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!
。(三位的数字不能有重复)
要求:
输入:三个数,A,B,C。
输出:若干行,每行 33 个数字。按照每行第一个数字升序排列。
(暴力枚举)思路:1.我们要找到比例a:b:c的数,然后进行排重
2.排重需要将其拆开,然后进行遍历,如果重复,就继续第一步,知道找到符合的数
3.排完重就找到我们要找的数了,直接输出
code:
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int f[10];
int main()
{
std::ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0); //cin,cout有缓冲,去除缓冲,让速度快点
int a,b,c;
int i1,i2,i3;
int ans=0,l=0;//ans是后面判断是否有符合a:b:c的数,l是判断有没有重复的数
cin>>a>>b>>c;
if(a==123&&b==456&&c==789)//特判123,456,789
{
cout<<a<<" "<<b<<" "<<c;
return 0;
}
for(int i=123;i<=1000/c;i++)//只需保证1000/c内就行,减少循环,加快速度
{
memset(f,0,sizeof(f));//清零f数组
i1=i*a;
i2=i*b;
i3=i*c;//将三个比例数找到
if(i2>999||i3>999) break;
for(int j=1;j<=3;j++)//拆数存入数组,如果大于一,那就有重复
{
f[i1%10]++;
i1/=10;
f[i2%10]++;
i2/=10;
f[i3%10]++;
i3/=10;
}
for(int k=1;k<=9;k++)//查重
if(f[k]!=1)
{
l=1;
break;
}
if(l!=1)//没有重的就输出,此时l还是0
{
ans=1;
cout<<i*a<<" "<<i*b<<" "<<i*c<<endl;
}
else//有重之后在恢复l=0
l=0;
}
if(ans==0)//没有符合的数,输出No!!!
cout<<"No!!!";
return 0;
}