P1008 [NOIP1998 普及组] 三连击优质解答

这篇博客介绍了使用嵌套循环寻找满足特定条件的三位数整数解,即a、b、c的组合,使得它们的数字和及乘积分别等于1到9的总和。博主尝试了暴力解法,但超时未通过。
#include <stdio.h>
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);
            }
    return 0;
}

上面是题解最优,思路就是两集合内元素各自相加相乘都相等,则这两集合相同个人总结:

因为只有三位数,故

a/100,取最左边数字

a/10%10,取中间数字

a%10 取最右边数字


#include<stdio.h>
#include<stdio.h>
int main()

{
	int a,b,c,d,e,f,g,h,k;
	int i,n;
	int number1,number2,number3;
	
	
		for(a=1;a<10;a++){
		for(b=1;b<10;b++){
			for(c=1;c<10;c++){
				for(d=1;d<10;d++){
					for(e=1;e<10;e++){
						for(f=1;f<10;f++){
							for(g=1;g<10;g++){
								for(h=1;h<10;h++){
									for(k=1;k<10;k++){
										if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=k&&
										b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=k&&
										c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=k&&
										d!=e&&d!=f&&d!=g&&d!=h&&d!=k&&
										e!=f&&e!=g&&e!=h&&e!=k&&
										f!=g&&f!=h&&f!=k&&
										g!=h&&g!=k&&
										h!=k){
											if(2*(g*100+h*10+k)==(d*100+e*10+f)&&
											(a*100+b*10+c)==3*(g*100+h*10+k)){
												printf("%d %d %d\n",(g*100+h*10+k),(d*100+e*10+f),(a*100+b*10+c));
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	
	
	
	
	
 } 

这是我的傻瓜式题解,交上去还是超时了,直接暴力题解 。就像是恺翁的买糖果种类得到启发。

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、付费专栏及课程。

余额充值