求大家帮忙解决下这个问题吧

slatly 2012-04-05 10:25:56
1-8 8个数
输出所有的排列组合
两位到八位的
不重复

很早以前有个RAR文件密码忘了
但能记得大部分单词 忘记怎么排列组合了
网上找了好多解密软件都不行
穷举破解不知道解到何年何月了
才想用这个办法把所有可能的组合输出下
自己再一个一个试吧

求大家帮帮忙给个类似的程序吧
自己回去修改一下
非常感谢
...全文
161 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
山河1030 2012-04-11
  • 打赏
  • 举报
回复
楼上的可以
zwb8848happy 2012-04-08
  • 打赏
  • 举报
回复
最好别用递归,数字一多太耗时了


#include<stdio.h>
#include<stdlib.h>
int final;

void fun(int *a,int k,int n);
int fun2(int *a,int n);
void input(int *a,int n);
void output(int *a,int n);
int main()
{
int k=0,*a,n;
printf("Please input n: ");
scanf("%d",&n);
a=(int*)malloc(sizeof(int)*n);
input(a,n);
final=fun2(a,n);
fun(a,k,n);
return 0;
}

void input(int *a,int n)
{
int i;
printf("Please input elems:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
}
int fun2(int*a,int n)
{
if(n==1)
return 1;
else
return a[n-2]*fun2(a,n-1);
}

void fun(int*a,int k,int n)
{
int temp,i;
static count=0;
if(k==n)
{
count++;
output(a,n);
if(count%final==0)
printf("\n");
}
for(i=k;i<n;i++)
{
temp=a[i]; a[i]=a[k]; a[k]=temp;
fun(a,k+1,n);
temp=a[i]; a[i]=a[k]; a[k]=temp;
}
}

void output(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d",a[i]);
printf(" ");
}


编程点滴 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

C/C++ code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
voi……
[/Quote]
老兄,看你这么久,觉得你好给力啊,回的贴老是那么详细
赵4老师 2012-04-05
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000];//递归用的栈,并记录当前生成的排列
void Make_Map(char *str) {//统计字符串的相关信息
int s[256];
int i;
memset(s,0,sizeof(s));
memset(count,0,sizeof(count));
m=strlen(str);
while(*str) {
s[*str]++;
str++;
}
n=0;
for (i=0;i<256;i++)
if (s[i]) {
map[n]=i;
count[n]=s[i];
n++;
}
}
void Find(int depth) {//递归式回溯法生成全排列
if (depth==m) {
int i;
for (i=0;i<depth;i++) putchar(map[stack[i]]);
putchar('\n');
} else {
int i;
for (i=0;i<n;i++)
if (count[i]) {
stack[depth]=i;
count[i]--;
Find(depth+1);
count[i]++;
}
}
}
void main(int argc,char**argv) {
if (argc<2) {
printf("%s 要产生全排列的字符串\n",argv[0]);
return;
}
Make_Map(argv[1]);
Find(0);
}

#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 26
int comb[MAX_NUM];
int c1,c2;
void combination(int m, int n)
{
int i, j;
for (i = m; i >= n; i--){
comb[n] = i; /* 选择当前的“头”元素 */
if (n > 1){
/* 进入下一次更小的组合问题 */
combination(i - 1, n - 1);
}else{
/* 满了需要的组合数,输出 */
for (j = comb[0]; j > 0; j--){
printf("%c", 65+c1-comb[j]);
}
printf("\n");
}
}
return;
}
int main(int argc, char *argv[])
{
if (argc<3) {
printf("%s 组合下标 组合上标\n",argv[0]);
return 0;
}
c1=atoi(argv[1]);
if (c1<1||26<c1) {
printf("1<=组合下标<=26\n");
return 0;
}
c2=atoi(argv[2]);
if (c2<1||c1<c2) {
printf("1<=组合上标<=组合下标\n");
return 0;
}
comb[0]=c2;
combination(c1, c2); /* C(4, 2) */
return 0;
}
面包大师 2012-04-05
  • 打赏
  • 举报
回复
终于有个高效率的排列组合算法
希望对楼主有所帮助
luochao7050838 2012-04-05
  • 打赏
  • 举报
回复
好像不难,需要那么复杂么,逻辑想清楚就好了
vanxeger 2012-04-05
  • 打赏
  • 举报
回复
这个问题,肯定有解的!坐等答案!
半盒阿尔卑斯 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

C/C++ code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int m;//记录字符串长度
int n;//记录字符串中的字符种类数
char map[256];//记录是哪几种字符
int count[256];//记录每种字符有多少个
int stack[1000]……
[/Quote]
我怎么就没有详细的感觉呢

69,371

社区成员

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

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