P1618 三连击(升级版)很多博客写的答案过不了!!(已给出原因)

三连击(升级版)

题目描述

1 , 2 , … , 9 1, 2,\ldots, 9 1,2,,9 9 9 9 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A : B : C A:B:C A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

//感谢黄小U饮品完善题意

输入格式

三个数, A , B , C A,B,C A,B,C

输出格式

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

样例 #1

样例输入 #1

1 2 3

样例输出 #1

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

提示

保证 A < B < C A<B<C A<B<C


upd 2022.8.3 \text{upd 2022.8.3} upd 2022.8.3:新增加二组 Hack 数据。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool areDigitsUnique(int num1, int num2, int num3)//判断输入的三个三位数是否为1-9的不重复序列
 {
    vector<int> digits(9, 0); // 初始化一个大小为9的向量,所有元素初始化为0

	// 将第一个数的每一位添加到向量中
    for (int i = 0; i < 3; ++i) {
        digits[i] = (num1 % 10);
        num1 /= 10;
    }
    // 将第二个数的每一位添加到向量中
    for (int i = 0; i < 3; ++i) {
        digits[i + 3] = (num2 % 10);
        num2 /= 10;
    }

    // 将第三个数的每一位添加到向量中
    for (int i = 0; i < 3; ++i) {
        digits[i + 6] = (num3 % 10);
        num3 /= 10;
    }

    // 检查数字是否在0-9之间且不重复
    sort(digits.begin(), digits.end()); // 对向量进行排序
    for (int i = 0; i < 8; ++i) {
        if (digits[i] <= 0 || digits[i] > 9 || digits[i] == digits[i + 1]) {
            return false; // 发现不满足条件
        }
    }
    return digits[8] > 0 && digits[8] <= 9; // 最后检查最后一个数字
}

int main()
{
	int a, b, c;
	cin >> a >> b >> c;
	
	if(a == 0)
	{
		cout << "No!!!";
		return 0;
	}
	bool flag = 1;
	for(int x = 100; x <= 999; x++)
	{	
		if(x%a==0)
		{
			int y = x/a*b;
			if(y<1000)
			{
				int z = y/b*c;
				if(z < 1000)
				{
					if(areDigitsUnique(x, y, z))
					{
						cout << x <<' '<< y << " "<< z << endl;
						flag = 0;
					 } 
				}
			}
		}
	}
	
	if(flag==1)
	{
		cout << "No!!!";
	}
	return 0;
} 

运行通过!
在这里插入图片描述

注意

一些博客上判断1-9并且不重复中,使用求和45,乘积为362880的方式,如下图:

(i / 100 + i / 10 % 10 + i % 10 + x / 100 + x / 10 % 10 + x % 10 + y / 100 + y / 10 % 10 + y % 10 == 45)&&((i / 100 )* (i / 10 % 10) * (i % 10) * (x / 100) * (x / 10 % 10) * (x % 10) * (y / 100) * (y / 10 % 10) * (y % 10)==362880)

我来给出反例:

#include <iostream>
using namespace std;

int main()
{
	//反例: 154, 294, 794
	cout <<"反例:" << 77*2 << ' ' << 147*2 << ' ' << 397*2 << endl; 	
	cout << "求和:" << 1+5+4+2+9+4+7+9+4 << endl; 
	cout << "乘积:" <<  1*5*4*2*9*4*7*9*4 << endl;
	return 0;
}

运行结果:
在这里插入图片描述
求和与乘积都满足,但是有重复数字,所以不过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值