排列1-9为3个3位数,使得结果为1:2:3

题目要求:

用1,2,3,...,9组成3个三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解。


思路:

这道题不难,关键在于怎么判断是否每个数字使用一次。由于自己没想出好的办法,看到别人好的思路就想mark下来。

1. 要求1~9这9个数字都使用且只能使用一次,所以想到用循环,对每3个三位数组成进行判断

2. 循环初始可以从123开始,是最小的且数字不重复的三位数。3个三位数中最小的那一个,最大最大可以循环到333,333*3=999

3. 关于怎么判断是否每个数字使用一次是最关键的一步。比较蠢的方法是取出9个数字分别来比较一下,但是想想这得写多少句判断语句啊,于是放弃了。。从网上看到别人好的思路是!用数组!定义一个长度为10的数组,把0~9出现的次数记录下来,然后只需要判断是否次数为1即可,之前把每一个数字都相互比较一下的想法就显得非常愚蠢了。

4. 这个是刚开始的想法,没有下面的代码那么好:数组中记录的是数字出现的次数,也就是每出现一次就+1,如s[i/100]+=1; 然后后面就要判断数组中1~9每个元素的数字是否都是1。而这种写法用for循环判断也显得累赘。

5. 这个是下面代码的比较好的想法,数组中记录的是这个数字是否有出现,也就是无论出现一次两次三次数组元素的值都是1,没有出现则是0。在最后判断的地方,只需要把数组1~9元素的值相加,如果相加结果是9则说明每个数字都只出现一次,毕竟如果有一个数字出现两次的话相加不可能为9的。难题解决了,下面就可以输出啦啦啦啦啦


  1. #include<iostream>  
  2. using namespace std;  
  3. int main(){  
  4.     int s[10];//定义一个数组记录0~9出现的次数   
  5.     for(int i=123;i<(987/3);i++){  
  6.         for(int m=0;m<10;m++)  
  7.             s[m]=0;  
  8.         s[i/100]=1;  
  9.         s[i/10%10]=1;  
  10.         s[i%10]=1;  
  11.         int j=i*2;  
  12.         s[j/100]=1;  
  13.         s[j/10%10]=1;  
  14.         s[j%10]=1;  
  15.         int k=i*3;  
  16.         s[k/100]=1;  
  17.         s[k/10%10]=1;  
  18.         s[k%10]=1;  
  19.         int sum=0;  
  20.         for(int m=1;m<10;m++)  
  21.             sum+=s[m];  
  22.         //将1~9每个数字出现次数加起来,如果等于9则每个数字都出现了一次   
  23.         if(sum==9) cout<<i<<" "<<j<<" "<<k<<endl;  
  24.     }  
  25.     return 0;  
  26. }   


运行结果:

192 384 576
219 438 657
273 546 819
327 654 981

<think>好的,用户想了解MATLAB中bitget函数的参数counter和索引范围5:-1:1的含义。首先,我需要回顾bitget函数的基本用法。根据引用资料,bitget用于获取二进制数的特定位。参数方面,第一个参数是要处理的数,第二个参数是指定位的位置。 现在用户提到的参数counter,可能指的是第一个参数,也就是要处理的数值。而索引范围5:-1:1可能是指定位的位置参数。这里的5:-1:1是MATLAB中的索引语法,表示从第5位到第1位,步长为-1,即倒序排列。比如,对于十进制数,转换为二进制后,通常从右到左编号为第1位到第n位。但需要注意,MATLAB中的bitget函数的位置参数是否是从最低位开始还是最高位。根据引用中的例子,比如bitget(5,5:-1:1),可能是指获取从高位到低位的第5到第1位,如果数值的二进制位数不足,高位补零。例如,5的二进制是101,用5位表示则是00101,所以bitget(5,5:-1:1)会返回[0 0 1 0 1],即从高位到低位依次取5位。 需要确认的是,bitget的位置参数是否支持向量输入,比如同时获取多个位。根据引用中的例子,确实可以一次获取多个位,并以数组形式返回。索引范围5:-1:1的作用是调整位的顺序,比如原本bitget返回的是从低位到高位的第1位到第5位,但使用5:-1:1后,可能反转顺序,使得结果数组按高位到低位排列。例如,数值5的二进制是101,使用5位的话是00101,bitget(5,5:-1:1)会依次检查第5位到第1位,即从最高位到最低位,结果为0,0,1,0,1,这样数组的顺序就是高位在前,低位在后。 总结来说,counter参数是要处理的数值,而5:-1:1是索引范围,指定要获取的位的位置,并且通过步长-1实现逆序排列,使得结果数组按高位到低位的顺序排列。需要提醒用户注意MATLAB中位的位置编号是从最低位(最右边)作为第1位,所以在处理多位数时,高位可能需要补零。同时,使用这种索引方式可以方便地获取二进制数的各个位并按特定顺序排列,适用于需要高位优先处理的场景,比如二进制转换或位操作分析。</think>### MATLAB `bitget` 函数中参数 `counter` 和索引 `5:-1:1` 的含义 #### 1. `bitget` 函数的基本作用 `bitget` 是 MATLAB 中用于获取二进制数特定位的函数。其语法为: ```matlab bitget(counter, bit_indices) ``` - **`counter`**: 输入的十进制整数或数组。 - **`bit_indices`**: 要获取的二进制位的位置索引(从最低位开始编号,最低位为第 1 位)[^1][^2]。 #### 2. 参数 `counter` 的含义 `counter` 表示待处理的十进制整数或数组。例如: ```matlab counter = 10; % 十进制数 10 的二进制为 1010 bits = bitget(counter, 4:-1:1); % 获取第4到第1位的二进制值 ``` 输出结果为 `[1, 0, 1, 0]`,对应二进制位 `1010` 的高位到低位[^3]。 #### 3. 索引 `5:-1:1` 的作用 索引 `5:-1:1` 表示从第5位到第1位逆序取值: - **`5:-1:1`**: 等价于 `[5,4,3,2,1]`,即先取第5位(高位),最后取第1位(低位)[^4]。 - **用途**: 当数值的二进制位数不足时,高位自动补零。例如: ```matlab counter = 5; % 二进制为 1013位) bits = bitget(counter, 5:-1:1); % 输出 [0,0,1,0,1] ``` 结果为高位补零后的完整5位二进制表示[^5]。 #### 4. 典型应用场景 - **位操作分析**:提取特定位用于逻辑运算或状态判断。 - **二进制转换**:将十进制数转换为固定长度的二进制数组,例如: ```matlab decimal_num = 15; binary_bits = bitget(decimal_num, 8:-1:1); % 输出 [0,0,0,0,1,1,1,1] ``` ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值