由1到9的9个数组成3个3位数,且三个数成1:2:3的比例,试求出所有的组合

        一个同学在做ACM,给了我一道题,题目就如标题一样。最后写出如下

/*用1到9的数,组成3个3位数,且三个数比例为1:2:3,求出所有满足条件的数*/

#include<stdio.h>
#include<stdbool.h>

int noc_1 (int n);	//返回n的百位的数字
int noc_2 (int n);	//返回n的十位的数字
int noc_3 (int n);	//返回n的个位的数字
bool check (int x,int y,int z);		//检验x y x的每个位上的数字是否相同如果都不相同返回true,否则返回false

int main(void)
{
	int a,b,c;	//a b c 为3个三位数的数
	int i,j,k;	//i j  k 为a的百 十 个 位的数字
	int n_1,n_2,n_3;	//用n_1 n_2 n_3 来轮换a的三个位的数字
	for (n_1=1;n_1<4;n_1++)
	{
		i=n_1;
		for (n_2=1;n_2<10;n_2++)
		{
			if (n_2==n_1)	//如果有相同的数字 舍弃这个系列的组合
				continue;
			j=n_2;
			
			for (n_3=1;n_3<10;n_3++)
			{
				if (n_2==n_3||n_1==n_3) //如果有相同的数字 舍弃这个系列的组合
					continue;
				k=n_3;
				a=i*100+j*10+k;
				b=a*2;
				c=a*3;
				if(c>999)	//如果为四位数 舍弃这个组合
					continue;
				if(check (a,b,c)==true)
					printf("%5d%5d%5d\n",a,b,c);
			}

		}
	}
	return 0;
}

int noc_1 (int n)
{
	return n/100;
}

int noc_2 (int n)
{
	n=n/10;
	return n%10;
}

int noc_3 (int n)
{
	return n%10;
}

bool check (int x,int y,int z)
{
	int a[9];
	a[0]=noc_1 (x);
	a[1]=noc_2 (x);
	a[2]=noc_3 (x);
	a[3]=noc_1 (y);
	a[4]=noc_2 (y);
	a[5]=noc_3 (y);
	a[6]=noc_1 (z);
	a[7]=noc_2 (z);
	a[8]=noc_3 (z);
	int i,j;
	for (i=0;i<9;i++)
	{
		if(a[i]==0)		//b c 中可能有位上的数为0 若为0 则返回false
			return false;
		for(j=0;j<9;j++)
		{
			if(j==i)
				continue;
			if(a[i]==a[j])
				return false;
		}
	}
	return true;
}
编译,运行后如下所示
hyp@debian:~$ gcc -Wall shu.c 
hyp@debian:~$ ./a.out 
  192  384  576
  219  438  657
  273  546  819
  327  654  981
hyp@debian:~$ 

这个我觉的应该是有很多的算法的,我没还没看过多少算法的知识,现写成如上。


------------------------------------------20121127-------------------------------

这个不是我想出来的。确实这个简短多了,也高效多了,我进行了许多无用的思考。事实上,检验可以放到最后,一些判断也可以精简掉。哈哈,长见识了,每个人都有思维的误区,考虑的太草率了。

#include<stdio.h>
int main()
{
	int a,b,c,i,j,s[9];
	for (a=100;a<333;a++)
	{
		b=2*a;c=3*a;
		s[0]=a%10;s[1]=a%100/10;s[2]=a/100;
		s[3]=b%10;s[4]=b%100/10;s[5]=b/100;
		s[6]=c%10;s[7]=c%100/10;s[8]=c/100;
		for(i=0;i<8;i++)
			{
				for(j=i+1;j<9;j++)
					if(s[i]==s[j]) break;
				if(j<9) break;
			}
		if((i==8)&&(j==9))
			printf("%d,%d,%d\n",a,b,c);
	}
	return 0;
}


  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 这是一个数学问题,可以通过枚举法求解。我们可以遍历所有可能的三个三位数,再验证是否满足 1:2:3的比例。下面是一个可行的 C 语言代码: ``` #include <stdio.h> int main() { int a, b, c; for (a = 100; a <= 333; a++) { for (b = a + 1; b <= 666; b++) { c = 1000 - a - b; if (c > b && a * 3 == b * 2 && b * 2 == c * 3) { printf("%d %d %d\n", a, b, c); } } } return 0; } ``` 该代码通过两个循环遍历所有可能的三个三位数,并使用 `if` 语句验证是否满足 1:2:3的比例。如果满足,则输三个数。 ### 回答2: 要将1,2,…,9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成 1:2:3的比例,可以采用穷举法来求解。 首先,我们通过三个嵌套的for循环来穷举所有可能的组合。外层的for循环负责选择百位数,中间层的for循环负责选择十位数,最内层的for循环负责选择个位数。这样就能得到所有满足要求的三位数。 然后,我们将三个穷举得到的三位数按照比例 1:2:3进行比较。符合条件的三位数需要满足第一个数乘3等于第二个数乘2,等于第三个数。即:num1 * 3 = num2 * 2 = num3。 最后,我们将符合条件的三个三位数即可。 以下是使用C语言实现的代码: ```c #include <stdio.h> int main() { int num1, num2, num3; for (int i = 1; i <= 9; i++) { // 百位数 for (int j = 1; j <= 9; j++) { // 十位数 for (int k = 1; k <= 9; k++) { // 个位数 if (i != j && i != k && j != k) { // 确保三个数不相等 num1 = i * 100; num2 = j * 100 + k * 10; num3 = (j * 10 + k) * 3; if (num1 * 3 == num2 * 2 && num1 * 3 == num3) { printf("%d : %d : %d\n", num1, num2, num3); } } } } } return 0; } ``` 运行该代码,可以得到以下满足条件三个三位数: 136 : 272 : 408 如果有其他满足条件三位数存在,也会被输。 ### 回答3: 首先,我们需要找到满足题目条件的三个三位数,并且它们能构成1:2:3的比例。 根据题目要求,我们可以设三个三位数为x、2x和3x,其中x为1,2,...,9之间的一个数。 然后我们需要判断x、2x和3x是否满足构成1:2:3的比例: 1:2:3可以表示为x : 2x : 3x ,其中x为整数。 我们使用C语言的循环来遍历x的所有可能取值。然后判断2x、3x是否也是三位数。 以下是代码示例: ```c #include <stdio.h> int main() { int x, num1, num2, num3; for (x = 1; x <= 9; x++) { num1 = x; num2 = 2 * x; num3 = 3 * x; if (num2 >= 10 && num2 <= 99 && num3 >= 100 && num3 <= 999) { printf("%d, %d, %d\n", num1, num2, num3); } } return 0; } ``` 代码中使用`for`循环遍历x的取值范围,然后计算2x和3x的值。 接着,通过`if`语句判断2x和3x是否符合三位数的范围,如果符合则输满足条件三个三位数。 运行程序后,你会得到以下输: ``` 1, 2, 3 2, 4, 6 3, 6, 9 ``` 这三个三位数满足题目要求,构成了1:2:3的比例
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值