P1618 三连击(升级版) 题解

题目描述

将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数的比例是A:B:C,试求出所有满足条件的三个三位数,若无解,输出“No!!!”。
//感谢黄小U饮品完善题意

输入格式
三个数,A B C。

输出格式
若干行,每行3个数字。按照每行第一个数字升序排列。

输入输出样例

输入 #1

1 2 3

输出 #1

192 384 576
219 438 657
273 546 819
327 654 981

说明/提示

保证A<B<C

根据题意,暴力输出。
之前提交一次,得了六十分。二三点没过,提示short,重新看了一遍题目,结果发现漏了输出无解的情况。。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;

int a, b, c;
int check[10] = {0};
int tempa, tempb, tempc;
int a1, a2, a3;
int b1, b2, b3;
int c1, c2, c3;
int ans;

int main()
{
	scanf("%d %d %d",&a,&b,&c);//输入三个数字a,b,c
	for (int i=1;i<987;i++)//对每一个数进行遍历,到987为止,因为超过987是不可能的。
	{
		tempa = i * a;//得到要输出的这三个数的值
		tempb = i * b;
		tempc = i * c;
		if (tempb > 987 || tempc > 987)break;//判定
		//将得到的每一个数进行分解,分解后的各个数字存入数组中
		//让数组中序号与值相同,如果不相同,那么这分解得到的数中就有重复
		a1 = tempa / 100; check[a1] = a1;
		a2 = tempa / 10 % 10; check[a2]=a2;
		a3 = tempa % 10; check[a3]=a3;

		b1 = tempb / 100; check[b1]=b1;
		b2 = tempb / 10 % 10; check[b2]=b2;
		b3 = tempb % 10; check[b3]=b3;

		c1 = tempc / 100; check[c1]=c1;
		c2 = tempc / 10 % 10; check[c2]=c2;
		c3 = tempc % 10; check[c3]=c3;
		//判定是否一一对应
		if (check[0]==0&&check[1]==1 && check[2] == 2 && check[3] ==3 && check[4] == 4 && check[5] == 5 && check[6] == 6 && check[7] == 7 && check[8] == 8 && check[9] == 9)
		{
			printf("%d %d %d\n", tempa, tempb, tempc);//打印
			memset(check, 0, sizeof(check));//重置数组
			ans++;//ans用作判断是否有解,无解就一直是0
		}
		else
		{
			memset(check, 0, sizeof(check));
			//数组被使用过,要重置数组,
		}
	}
	if (!ans)printf("No!!!");//无解时输出。
	return 0;
}
发布了53 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/YUEXILIULI/article/details/98038412