【洛谷】P1008 三连击

博客围绕一道算法题展开,题目要求将1 - 9共9个数分成3组组成3个三位数,使这3个三位数构成1:2:3的比例,需找出所有满足条件的3个三位数。还提及解题时想简化但未成功,写了判断数字重复的函数,最后展示了大佬代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目背景

本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。

题目描述

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

输入输出格式

输入格式:

木有输入

输出格式:

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

输入输出样例

输入样例#1:

输出样例#1: 

192 384 576
* * *
...

* * *
(输出被和谐了)

本来想着怎样才能简化,最后想不出来,还专门写了两个函数,一个函数判断单个数是否有重复使用数字,另一个判断两个数字之间是否有重复使用数字。

#include <iostream>
using namespace std;

bool can(int n);
bool inspect(int n1, int n2);

int main(){
	
	//可从987 简化到333 
	for(int a=123;a<=333;a++){
		if(!can(a))continue;
		int b = a*2;
		if(!can(b))continue;
		int c = a*3;
		if(!can(c))continue;
		if(!inspect(a, b)||!inspect(a, c)||!inspect(b, c))continue;
		cout << a << " " << b << " " << c << endl;
	}
	
	return 0;
}

bool can(int n){
	int a = n%10;
	n /= 10;
	int b = n%10;
	n /= 10;
	int c = n%10;
	if(a==0||b==0||c==0||a==b||a==c||b==c)
		return false;
	else 
		return true;
}

bool inspect(int n1, int n2){
	int a1 = n1%10;
	n1 /= 10;
	int b1 = n1%10;
	n1 /= 10;
	int c1 = n1%10;
	int a2 = n2%10;
	n2 /= 10;
	int b2 = n2%10;
	n2 /= 10;
	int c2 = n2%10;
	if(a1==a2||a1==b2||a1==c2||b1==a2||b1==b2||b1==c2||c1==a2||c1==b2||c1==c2)
		return false;
	else 
		return true;
}

下面是大佬的代码,同样是暴力,都有差距,伤心了。

#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;
} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随处可见的打字员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值