把1,2,3,4,5,6,7,8,9分成三组构成排列且之比为1:2:3

题目描述:

把1,2,3,4,5,6,7,8,9共九个数分成三组构成排列a1a2a3,a4a5a6,a7a8a9,而且每个数字使用有且仅有一次,构成的排列之比为1:2:3,求输出所有的排列组合。

主要还是得通过蛮力法来做,但我们可以通过计算来减小循环的次数。

1-9构成的最小的数字排列应该是123(百位取1的时候最小,当1被用过之后,十位取2最小,当1,2都被用过之后,个位取三最小),同理1-9构成的最大数字排列应该是987,我们假设构成的最小排列数是i,又因为三个排列之比为1:2:3,所以最大的数应该为3*i,这是循环的控制条件就可以出来了:3*i<=987.

唉,同时我们还要思考另外一个问题,我们该怎么来保证1-9中的数字使用有且仅有一次,这个时候我们选择使用一个辅助数组a[10],一开始给这个数组的每个元素都赋值为0,然后a[0]=0一直不变,a[1]对于1这个数字,a[2]对于2这个数字,以此类推,如果这个数字被用过了,则这个数字对应的数组元素就赋值为1.如果在循环结束后,数组中a[1]-a[9]的元素之和等于9(只有当每个数字都使用了一次,和才会为9,否则都是小于9的),这时我们就可以判定1-9中的元素使用了有且仅以一次。

#include <stdio.h>
int main()
{
    int i,h,j,k,s;
    int a[10];
    for(i=123;i*3<=987;i++)
    {
        for(h=0;h<10;h++)//为了不让上一次数组a[10]里的值影响到下一次循环,所以每次进行循环都要将a[10]全部赋值为0
            a[h]=0;
        a[i/100]=1;//把数字排列i百位的数字的对应数组元素赋值为1
        a[i/10%10]=1;//把数字排列i十位上的数字的对应数组元素赋值为1
        a[i%10]=1;//把数字排列i个位的数字的对应数组元素赋值为1
        j=i*2;//按照比例算出j的值,并和上面一样对相应的数组元素进行赋值
        a[j/100]=1;
        a[j/10%10]=1;
        a[j%10]=1;
        k=i*3;//同理按照比例算出此时的k的值
        a[k/100]=1;
        a[k/10%10]=1;
        a[k%10]=1;
        for(s=0,h=1;h<10;h++)
            s=s+a[h];//计算辅助数组所有元素之和
        if(s==9)//如果满足条件则输出此时的三个数字排列
        {
            printf("a1a2a3=%d,a4a5a6=%d,a7a8a9=%d\n",i,j,k);
        }
    }
    return 0;
}

 

 

 

 

 

  • 10
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 下面是一个C语言代码,实现了您所描述的题目要求: ``` #include<stdio.h> int main() { int i, j, k; for (i=1; i<=9; i++) for (j=1; j<=9; j++) for (k=1; k<=9; k++) if (i != j && i != k && j != k) if (i*100+j*10+k == 2*(j*100+k*10+i)) printf("%d,%d,%d\n", i*100+j*10+k, j*100+k*10+i, k*100+i*10+j); return 0; } ``` 代码说明: - 首先,使用三层循环对1,2,…,9这9个数进行遍历,并将它们组成三个三位数。 - 其次,使用if语句判断三个数是否有重复的数字。 - 最后,使用if语句判断三个数是否构成 1:2:3的比例,如果是,则使用printf语句输出。 运行这段代码,将得到满足条件的三个三位数: ``` 369,246,135 738,492,369 ``` ### 回答2: 要将1,2,…,99个数分成三组,首先可以根据1:2:3的比例确定第一个三位数的百位数字。因为三个三位数的比例是1:2:3,所以第一个三位数的百位数字可以是1,2,3。以第一个三位数的百位数字为基准,可以得到以下三个三位数的组合: 1. 1XX * 1 = 1XX 2. 2XX * 2 = 4XX 3. 3XX * 3 = 9XX 接下来,我们需要对第一个三位数的十位和个位数字进行排列组合,使得乘以对应的倍数后仍然是三位数。为了满足这个条件,我们可以用两个循环分别遍历十位和个位数字的所有可能性,然后依次计算并判断乘以对应倍数后的结果是否是三位数。若是三位数且数字不重复,则可添加到结果数组中。 最后,输出结果即可得到所有满足条件的三个三位数。 以下是用C语言实现的代码示例: ```c #include <stdio.h> int main() { int result[100][3]; // 存放结果的二维数组 int count = 0; // 结果的个数 for (int i = 1; i <= 3; i++) { for (int j = 0; j <= 9; j++) { if (i * 100 + j * 10 + j <= 999) { // 确保乘积仍然是三位数 if (j != i && j != 0) { // 数字不重复 result[count][0] = i * 100 + j * 10 + j; // 第一个三位数 result[count][1] = result[count][0] * 2; // 第二个三位数 result[count][2] = result[count][0] * 3; // 第三个三位数 count++; } } } } // 输出结果 for (int i = 0; i < count; i++) { printf("%d: %d %d %d\n", i+1, result[i][0], result[i][1], result[i][2]); } return 0; } ``` 该代码会输出所有满足条件的三个三位数,例如: 1: 123 246 369 2: 132 264 396 3: 213 426 639 4: 231 462 693 5: 312 624 936 6: 321 642 963 ### 回答3: 要将1,2,…,99个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,我们可以通过穷举法来求解。 算法思路: 1.首先,我们可以通过三重嵌套循环来遍历所有可能的组合。 2.外层循环i从100到999,中层循环j从100到999,内层循环k从100到999,分别代表三个三位数。 3.在每次循环中,我们将i、j、k转换为字符串,并通过字符串拼接的方式得到三个三位数num1、num2、num3。 4.我们再将num1、num2、num3转换为相应的整数,以便进行计算。 5.判断是否满足比例关系,即num1*num2*num3符合1:2:3。 6.如果满足比例关系,输出num1、num2、num3。 代码如下: ``` #include <stdio.h> int main() { int i, j, k; char num1[4], num2[4], num3[4]; for(i=100; i<=999; i++) { for(j=100; j<=999; j++) { for(k=100; k<=999; k++) { sprintf(num1, "%d", i); sprintf(num2, "%d", j); sprintf(num3, "%d", k); int x = atoi(num1); int y = atoi(num2); int z = atoi(num3); if(x*y*z == 2*x*z && x*y*z == 3*x*y) { printf("%d : %d : %d\n", x, y, z); } } } } return 0; } ``` 以上代码会输出满足条件的三个三位数num1、num2、num3,其中num1与num2的乘积等于num3,且num1与num3的乘积等于2*num2,num2与num3的乘积等于3*num1。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值