题目:求0—7所能组成的奇数个数。

做自己 不忘初心 2019-10-07 12:48:13
题目:求0—7所能组成的奇数个数。 哪位帮我看看对不对,谁有简单一点的方法。 执行结果发一下。
...全文
356 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
错了错了,刚才运行了一下所有的结果,发现重复了
qybao 2019-10-07
  • 打赏
  • 举报
回复
首位不为0,个位不为偶数,中间位不重复的所有排列,总共17280种
通过排列组合公式也可以验证个位为奇数的全排列有7的阶乘*4=20160 //个位是4种选择(1357)
除去首位为0的情况 1*6的阶乘*4 //首位为0(1种选择),个位为奇数4种选择=2880
所以一共有20160-2880=17280种组合
void main() {
int[] num = {0, 1, 2, 3, 4, 5, 6, 7};
int[] idx = {0, 0, 0, 0, 0, 0, 0, 0};
int count = 0, exist = 0;
for (idx[0]=1; idx[0]<8; idx[0]++) { //首位不为0
for (idx[7] = 1; idx[7]<8; idx[7]+=2) { //个位不为偶数
if (idx[7] == idx[0]) continue;
while (true) { //中间位不重复
for (int i=6; i>1; i--) {
if (idx[i] >= 8) {
idx[i] = 0;
idx[i-1]++;
}
}
if (idx[1] >= 8) {
for (int i=1; i<7; i++) {
idx[i] = 0;
}
break;
}
exist = 0;
for (int i=1; i<7; i++) {
if (idx[i] == idx[0] || idx[i] == idx[7]) {
exist = 1;
break;
}
for (int j=i+1; j<7; j++) {
if (idx[i] == idx[j]) {
exist = 1;
break;
}
}
if (exist == 1) break;
}
if (exist == 0) {
int n = idx[0];
for (int i=1; i<7; i++) {
n = 10*n + num[idx[i]];
}
n = 10*n + num[idx[7]];
printf("%d\n", n);
count++;
}
idx[6]++;
}
}
}
printf("%d\n", count); //
}
  • 打赏
  • 举报
回复
引用 4 楼 qybao 的回复:
用排列组合公式可以吗? 0-7一共8个数字做全排列=8的阶乘=40320 减去 数字0排在第一位的情况(出去0的7个数字做全排列)=7的阶乘=5040 然后总的排列情况分布是,奇数偶数各一半(因为个位数1357,0246各占一半) 所以结果是 (40320-5040)/ 2 = 17640
  • 打赏
  • 举报
回复
引用 7 楼 qq_33437675的回复:
[quote=引用 4 楼 qybao的回复:]用排列组合公式可以吗?
0-7一共8个数字做全排列=8的阶乘=40320
减去
数字0排在第一位的情况(出去0的7个数字做全排列)=7的阶乘=5040

然后总的排列情况分布是,奇数偶数各一半(因为个位数1357,0246各占一半)
所以结果是
(40320-5040)/ 2 = 17640
我靠,还有这种方法,可以可以。[/quote] 不过用这种方法这道题就没有一点乐趣了
  • 打赏
  • 举报
回复
引用 4 楼 qybao的回复:
用排列组合公式可以吗?
0-7一共8个数字做全排列=8的阶乘=40320
减去
数字0排在第一位的情况(出去0的7个数字做全排列)=7的阶乘=5040

然后总的排列情况分布是,奇数偶数各一半(因为个位数1357,0246各占一半)
所以结果是
(40320-5040)/ 2 = 17640
我靠,还有这种方法,可以可以。
lin5161678 2019-10-07
  • 打赏
  • 举报
回复
引用 5 楼 qq_33437675 的回复:
0--7组成的8位数,每个数只能有一个。然后求奇数
按照 #4的说法做就可以了
  • 打赏
  • 举报
回复
0--7组成的8位数,每个数只能有一个。然后求奇数
qybao 2019-10-07
  • 打赏
  • 举报
回复
用排列组合公式可以吗?
0-7一共8个数字做全排列=8的阶乘=40320
减去
数字0排在第一位的情况(出去0的7个数字做全排列)=7的阶乘=5040

然后总的排列情况分布是,奇数偶数各一半(因为个位数1357,0246各占一半)
所以结果是
(40320-5040)/ 2 = 17640
lin5161678 2019-10-07
  • 打赏
  • 举报
回复
无限个 哪怕不停1重复 都能构造无限个奇数 把你的题目描述完整
  • 打赏
  • 举报
回复
这个应该对了吧 谁帮我看看

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧