P1008 [NOIP1998 普及组] 三连击

该博客主要介绍了一个C++程序,用于寻找1到99之间的三个数字,组成三个三位数,使得这三个数的比例为1:2:3,并且它们的数字之和与1到9的数字之和相等。程序通过遍历可能的组合,检查数字和及乘积条件来找到满足要求的组合。

题目描述

将 1, 2, \ldots , 91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1 : 2 : 31:2:3 的比例,试求出所有满足条件的 33 个三位数。

输入格式

输出格式

若干行,每行 33 个数字

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int a,b,c;
    for(a=123;a<333;a++)
    {
        b=a*2;
        c=a*3;
        if((a/100+a/10%10+a%10+b/100+b/10%10+b%10+c/100+c/10%10+c%10==1+2+3+4+5+6+7+8+9)&&((a/100)*(a/10%10)*(a%10)*(b/100)*(b/10%10)*(b%10)*(c/100)*(c/10%10)*(c%10)==(1)*(2)*(3)*(4)*(5)*(6)*(7)*(8)*(9)))
             printf("%d %d %d\n",a,b,c);
    }
    system("pause");
}

P1008 [NOIP1998 普及组] 连击题目要求将 1 - 9 共 9 个数分成 3 组,分别组成 3 个位数,且使这 3 个位数构成 1:2:3 的比例,需要找出所有满足条件的 3 个位数。 ### 解题思路 个由 1 - 9 组成的 3 位数字,满足 1:2:3 的比例关系。第一个数字最小为 100,最大不会超过 333(因为若第一个数字大于 333,第个数字会大于 1000,无法构成 3 位数)。可以设一个布尔型 `vis` 数组,`vis[i]` 表示数字 `i` 是否出现过,1 - 9 这 9 个数字每个数字只能出现一次。在 100 - 333 范围内枚举第一个数字,检查该数字是否可用,步骤如下:对该数字做数字拆分,如果发现数字 0 则说明这个数字不能用;如果这个数字已经出现过了(`vis[i]` 为真),这个数字也不能用;如果这个数字没出现过,标记这个数字已出现过 [^4]。 ### 代码实现 ```python for i in range(100, 334): vis = [False] * 10 num1 = i num2 = i * 2 num3 = i * 3 # 检查 num1 的每一位 while num1: digit = num1 % 10 if digit == 0 or vis[digit]: break vis[digit] = True num1 //= 10 else: # 检查 num2 的每一位 while num2: digit = num2 % 10 if digit == 0 or vis[digit]: break vis[digit] = True num2 //= 10 else: # 检查 num3 的每一位 while num3: digit = num3 % 10 if digit == 0 or vis[digit]: break vis[digit] = True num3 //= 10 else: # 检查 1 - 9 是否都出现过 all_used = True for j in range(1, 10): if not vis[j]: all_used = False break if all_used: print(i, i * 2, i * 3) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值