洛谷水题题解——P1008三连击

洛谷题解——P1008

题目描述

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

输入格式
木有输入

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

代码

#include<cstdio>
#include<cstring>
int i,j,v;
bool a[10];//ai表示第i个数已经用过了 
int main()
{
	for(i=123;i<=329;++i)//第一个数的范围,也可以写成100-333
	{
		memset(a,0,sizeof(a));
		v=0;
		a[i%10]=a[i/10%10]=a[i/100]=1;
		a[i*2%10]=a[i*2/10%10]=a[i*2/100]=1;
		a[i*3%10]=a[i*3/10%10]=a[i*3/100]=1;
		//如果没有那个数字,那么对应的a就为0
		for(j=1;j<=9;j++)//看看1-9是否都有了 
		{
			v+=a[j];
		}
		if(v==9) printf("%d %d %d\n",i,i*2,i*3);
	}
	return 0;
 } 

另一种思想:集合A的数字之和等于集合B的数字之和且集合A的数字之乘等于集合B的数字之乘时,集合A与B元素相等。

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

另一种思想:

# include<stdio.h>

int main()
{
	int b, c, a[10], flag=0;
	for (int i = 100; i <= 333; i++)//第一个数的范围
	{
		b = i * 2; c = i * 3;
		//a中存储的是对应的数字
		a[0] = i / 100 % 10; a[1] = i / 10 % 10; a[2] = i % 10;
		a[3] = b / 100 % 10; a[4] = b / 10 % 10; a[5] = b % 10;
		a[6] = c / 100 % 10; a[7] = c / 10 % 10; a[8] = c % 10;
		for (int j = 0; j < 9; j++)//用标记看是否有两个数字相等
		{
			for (int k = j + 1; k < 9; k++)
			{
				if (a[j] == a[k]||a[j]==0||a[k]==0)flag = 1;
			}
		}
		if (flag == 0)printf("%d %d %d\n", i, b, c); 
		flag = 0;
	}
}

发布了46 篇原创文章 · 获赞 24 · 访问量 2037

猜你喜欢

转载自blog.csdn.net/weixin_43946347/article/details/104076135