基础问题,高分求解啊。。

_JeffreyWu 2012-06-26 08:55:38
问题是这样的:
0-9当中选出5个数,按照一定的奇偶性进行排列组合
比如:全偶, 全奇,偶偶偶偶偶,奇奇奇奇奇,奇偶偶偶偶,奇奇偶偶偶,奇奇奇偶偶......
这样应该一共有2^5=32种情况
对这32种情况下的所有排列组合进行输出,并保存到文件里

我用5层循环写了全奇和全偶两种,其它的不会了,现请教各位,该用什么算法,该怎么写。

附:我自己写的全奇全偶的代码

#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
char ou[6] = {'0','2','4','6','8','\0'};
char ji[6] = {'1','3','5','7','9','\0'};

ofstream out("全偶.txt");
int cnt = 0;
for (int a=0; a<5; a++)
{
for (int b=0; b<5; b++)
{
for (int c=0; c<5; c++)
{
for (int d=0; d<5; d++)
{
for (int e=0; e<5; e++)
{
char temp[6] = {ou[a], ou[b], ou[c], ou[d], ou[e], '\0'};
cout << temp << endl;
out << temp << ends;
cnt++;
}
}
}
}
}
out.close();
cout << "总数:" << cnt << endl;

out.open("全奇.txt");
cnt = 0;
for (int a=0; a<5; a++)
{
for (int b=0; b<5; b++)
{
for (int c=0; c<5; c++)
{
for (int d=0; d<5; d++)
{
for (int e=0; e<5; e++)
{
char temp[6] = {ji[a], ji[b], ji[c], ji[d], ji[e], '\0'};
cout << temp << endl;
out << temp << ends;
cnt++;
}
}
}
}
}
out.close();
cout << "总数:" << cnt << endl;

return 0;
}
...全文
383 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
布拉格曼 2012-06-29
  • 打赏
  • 举报
回复
5. 上述是计算组合的个数,如果要计算排列,如下:
(1) 0为非奇非偶,排除在外后,排列出的数值串总个数:
(100000)-(一个0的情况)-(两个0的情况)-(三个0的情况)-(四个0的情况)-(五个0的情况)
= 100000-5*(9的4次方)-(5的阶乘/2的阶乘)*(9的3次方)-(5的阶乘/3的阶乘)*(9的平方)-
(5的阶乘/4的阶乘)*9
= ^_^ 这个大家算一下,我就偷个懒了

(2) 0计入其内,不能为首个,则排列总数如下:
(100000)-(首位为0的情况) = 100000-(10的4次方) = 90000

(3) 0计入其内,可为首个,且数值无重复,则排列总数如下:
10的阶乘 = 大家算一下吧
布拉格曼 2012-06-29
  • 打赏
  • 举报
回复
不明白题意:

1. 是否只算奇偶,不论奇偶对应的值是多少?
如果只论奇偶的可能组合类别个数,应该是2的5次方种,分别为: (0代替表示偶数, 1代替表示奇数)
00000, 00001, 00010, 00011, 00100, 00101, 00110, 00111,
01000, 01001, 01010, 01011, 01100, 01101, 01110, 01111,
10000, 10001, 10010, 10011, 10100, 10101, 10110, 10111,
11000, 11001, 11010, 11011, 11100, 11101, 11110, 11111

2. 如果是全排列,整个拼接串是一个整数,而且得到的拼接整数可能是奇数,也可能是偶数
那么数值个数应该是 9*10*10*10*10 = 9000 个,因为最高位不能取0

3. 如果首位也可以取0,但是拼接串不是整数,只是字符串,
那么数值个数应该是 9*9*9*9*9 = 59049 个,因为0既不是偶数,也不是奇数

4. 如果是包括0在内的组合数值串,那么生成的可能串个数是:
(1) 数值无重复类别: 10*9*8*7*6 = 30240 个
(2) 数值允许重复类别: 10*10*10*10*10 = 100000 个
赵4老师 2012-06-27
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int i;
int L;
void main(int argc,char **argv) {
if (argc<2) {
printf("%s 要排列的字符串\n",argv[0]);
return;
}
L=strlen(argv[1]);
vector<char> P(L);
vector<char>::iterator b,e,it;
b=P.begin();
e=P.end();
for (i=0;i<L;i++) P[i]=argv[1][i];
sort(b,e);
i=0;
do {
printf("%10d: ",++i);
for(it=b;it!=e;it++) printf("%c",*it);
printf("\n");
} while (next_permutation(b,e));
printf("The total: %d",i);
}
  • 打赏
  • 举报
回复
A(5)9?
qq120848369 2012-06-26
  • 打赏
  • 举报
回复
很简单的, 就是求所有排列, 然后分类写到文件里.
pathuang68 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 5 楼 的回复:

晕死,这边你也发了,不过数据结构那边给的那个答案不是很好。。。。再给你一个一次性32个全生成的把:
C/C++ code

#include<stdio.h>
#include <fstream>
using namespace std;



int main()
{
ofstream out[32];
int cnt[32] ={0};……

可能我描述的不够准确。我的意思是:由5位数组成的所有数字的奇偶性的种数,写一段程序,生成每一种类型的奇偶排列对应的所有数字,应该有3125个。并保存到相应的文件里。
[/Quote]

一共应该有10 * 9 * 8 * 7 * 6个吧,相当于从10个数中取其中5个数的排列。参考下面代码:

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

#define N 10
#define M 5

int number[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int temp[M];

int total = 0;

// 会在E盘根目录下生成32个文件,比如_00000.txt表示全偶数排列;_00001表示前4个数为偶数,最后一个数为奇数的排列,以此类推
void write_file()
{
++total;
string filename = "E:/_";
for(int i = 0; i < M; ++i)
{
if(temp[i] % 2 == 0)
{
filename += "0";
}
else
{
filename += "1";
}
}

filename += ".txt";

ofstream fos(filename, ios::app);
if(!fos)
{
cout << "can not open file..." << endl;
exit(1);
}

for(int i = 0; i < M; ++i)
{
fos << temp[i] << " ";
}
fos << endl;
fos.close();
}

void move(int offset, int i) /* 交换两个数 */
{
int another;
another = number[offset];
number[offset] = number[i];
number[i] = another;
}

void permutation(int offset, int count) /* 排列 */
{
int i;
if(count == 0)
{
write_file();
return;
}
else
{
for(i = offset; i < N; i++)
{
temp[offset] = number[i];
move(offset, i);
permutation(offset+1, count-1);
move(offset, i);
}
}
}

int main()
{
int start = 0;
int count = M;

permutation(start, M); // 从10个数中,取M个数的排列
cout << total << endl;
}


上面代码应该还有优化空间。
酱油党 2012-06-26
  • 打赏
  • 举报
回复
然后你每种MODE每种排列如果符合某种Mode就写进对应file不符合就是新Mode创建一个新的文件,对应这种MODE 最终就会完成,然后可以通过统计相应file的方法得到这几个数的最终结果。就是感觉比较麻烦
酱油党 2012-06-26
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
using namespace std;

typedef struct tag_MODE
{
bool bFir;
bool bSec;
bool bThi;
bool bFou;
bool bFiv;
}MODE;

int nNum[5] = {0};

void getKey()
{
for ( int i = 0 ; i < 5 ; ++i )
{
nNum[i] = rand()%10;
for ( int j = 0 ; j < i ; ++j )
{
if ( nNum[j] == nNum[i] )
{
i--;
goto MID;
}
}
MID:
;
}
}

int main()
{
getKey();
//进行全排列,并对每种排列归类进MODE……
return 0;
}
酱油党 2012-06-26
  • 打赏
  • 举报
回复
#include <stdlib.h>
#include <stdio.h>
using namespace std;

typedef struct tag_MODE
{
bool bFir;
bool bSec;
bool bThi;
bool bFou;
bool bFiv;
}MODE;

int nNum[5] = {0};

void getKey()
{
for ( int i = 0 ; i < 5 ; ++i )
{
nNum[i] = rand()%10;
for ( int j = 0 ; j < i ; ++j )
{
if ( nNum[j] == nNum[i] )
{
i--;
goto MID;
}
}
MID:
;
}
}

int main()
{
getKey();
//进行全排列,并对每种排列归类进MODE……
return 0;
}
大尾巴猫 2012-06-26
  • 打赏
  • 举报
回复
我看到类似这种排列组合的题就很晕了。
smsgreenlife 2012-06-26
  • 打赏
  • 举报
回复
5楼的程序不错,这里又进行了一下优化,楼主看看,应该可以用了!

#include<stdio.h>
#include <fstream>
using namespace std;

int main()
{
ofstream out[32];
int cnt[32] ={0};
int i =0;
for (i =0;i<32;i++)
{
char szBuffer[32]={'0'};
int nMask =0x01;
for (int j=4;j>=0;j--)
{
if (i&nMask)
szBuffer[j]='1';
//else//这个可以去掉
//szBuffer[j]='0';
nMask<<=1;

}
strcpy(szBuffer+5,".txt");
out[i].open(szBuffer);
}
for (i =0;i<3125*32;i++)//i的范围为0到3125*32。
{
int j =0;
char szBuffer[32];
sprintf(szBuffer,"%05d",i);
int type =0;
for (j =0;j<5;j++)
{
if (szBuffer[j]%2!=0)
type|=1<<j;
}
out[type] <<szBuffer;
out[type] <<"\n";
cnt[type]++;

}
for (i =0;i<32;i++)
{
out[i] <<cnt[i];
}
return 0;
}
nodirection 2012-06-26
  • 打赏
  • 举报
回复
200
_JeffreyWu 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

晕死,这边你也发了,不过数据结构那边给的那个答案不是很好。。。。再给你一个一次性32个全生成的把:
C/C++ code

#include<stdio.h>
#include <fstream>
using namespace std;



int main()
{
ofstream out[32];
int cnt[32] ={0};
int i =0;
……
[/Quote]

你这个应该是正确的,那个生成5位数奇偶类型的我自己也写了一个

void fun()
{
for (int i=0; i<32; i++)
{
for (int j=0; j<5; j++)
{
printf("%s", (i >> j) & 1 ? "奇" : "偶");
}
printf("\n");
}
}

pathuang68说的也是,考虑的可能太深了。
可能我描述的不够准确。我的意思是:由5位数组成的所有数字的奇偶性的种数,写一段程序,生成每一种类型的奇偶排列对应的所有数字,应该有3125个。并保存到相应的文件里。
pathuang68 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 7 楼 的回复:

另外,有个问题问楼主:
你要求比如全偶的排列必须放在一起吗?如果不是的话,不用考虑你说的那32种情况,如果是的话,难度就大了许多。

比如:偶偶偶偶偶类型的数据在放在一个文件里 奇奇奇奇奇要在一个文件里,奇偶偶偶偶要在一个文件里。。。等等
就是这样哦
[/Quote]

我猜也是这个意思:)想确认一下。

这样一来难度就更大一些。
_JeffreyWu 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

另外,有个问题问楼主:
你要求比如全偶的排列必须放在一起吗?如果不是的话,不用考虑你说的那32种情况,如果是的话,难度就大了许多。
[/Quote]
比如:偶偶偶偶偶类型的数据在放在一个文件里 奇奇奇奇奇要在一个文件里,奇偶偶偶偶要在一个文件里。。。等等
就是这样哦
pathuang68 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:
引用 2 楼 的回复:

没明白你这个奇偶怎么排的?32种是怎么得到的??


楼主说的32种,应该是这个意思(假定0表示偶,1表示奇,00000表示全偶数排列,11111表示全奇数排列):
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
……
[/Quote]
这种问题数学上说起来是非常easy的,实现起来却有一定的难度。
莫_问 2012-06-26
  • 打赏
  • 举报
回复
点击下载
本人最新上传到c++资料,喜欢的可以看下,0分下载哦,亲
Corner 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
引用 2 楼 的回复:

没明白你这个奇偶怎么排的?32种是怎么得到的??


楼主说的32种,应该是这个意思(假定0表示偶,1表示奇,00000表示全偶数排列,11111表示全奇数排列):
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
……
[/Quote]
应该可以吧,设定1为偶数,格式为11000,那么就有两个偶数,从偶数数组中取2个进行排列,得到20种可能,从奇数数组中取3个进行排列得到60种可能,总共有20*60种可能。
pathuang68 2012-06-26
  • 打赏
  • 举报
回复
另外,有个问题问楼主:
你要求比如全偶的排列必须放在一起吗?如果不是的话,不用考虑你说的那32种情况,如果是的话,难度就大了许多。
pathuang68 2012-06-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

没明白你这个奇偶怎么排的?32种是怎么得到的??
[/Quote]

楼主说的32种,应该是这个意思(假定0表示偶,1表示奇,00000表示全偶数排列,11111表示全奇数排列):
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

感觉这个问题还是蛮有难度的。应该不能用常见的全排列算法来做。
加载更多回复(4)

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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