洛谷P1618 三连击(升级版)
这个题目可是有意思的很,大致意思如下
:给出一到九排成三个三位数,然后满足A:B:C的比值,也就是说这三个三位数中都必须遍历1到9才可以,并且是升序排列,那怎么做呢?
我先给出最开始的思路(失败)
:给定二维数组甚至三维数组(拿输出阳历来看无非是一个长度为4的数组里面每个数组元素又包括三个小数组)
当然,写了半天我选择放弃,根本写不出来;
于是就有了一个很有趣的解法:
从100到999开始遍历(123~987也可),如果满足这个数取余A是0的话,就让其余两个数等于i/A*B和i/A*C(i代表这个数)
然后在满足其余两个数都在题目条件之内中,定义了九个数组用来存放这三个百位数的各个数字,然后,精彩一幕来了,
为了确保这三个百位数都可以遍历1到9,我们就采取这九个数组的和与这九个数组的乘积等于1~9的和与9!;
然后输出满足条件的i,j,k就可以了
附上代码
:
#include<bits/stdc++.h>
using namespace std;
int a,b,c,flag=0;
int j,k;
int main()
{
scanf("%d%d%d",&a,&b,&c);
for(int i=100;i<=999;i++)
{
if(i%a==0)
{
j=i/a*b;
k=i/a*c;
if(j>=100&&j<=999&&k>=100&&k<=999)
{
int l[10],sum=0,xx=1;
l[1]=i/100;
l[2]=i/10%10;
l[3]=i%10;
l[4]=j/100;
l[5]=j/10%10;
l[6]=j%10;
l[7]=k/100;
l[8]=k/10%10;
l[9]=k%10;
for(int _i=1;_i<=9;_i++)
{
sum+=l[_i];
xx*=l[_i];
}
if(sum==45&&xx==362880)
{
flag=1;
printf("%d %d %d\n",i,j,k);
}
}
}
}
if(flag==0)printf("No!!!");
return 0;
}
本文来自博客园,作者:江上舟摇,转载请注明原文链接:https://www.cnblogs.com/LQS-blog/p/15862408.html

浙公网安备 33010602011771号