小小C语言的问题,求教!!!!(求任意4个数的排列,并将其打印)

fivebinggun 2012-05-27 12:17:34
#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;
printf("please in put four numbers :");
for(i=0;i<4;i++)
scanf("%d",&a[i]);
for(i=0;i<4;i++)
{
for(j=0;j<4;i++)
{
for(m=0;m<4;i++)
{
for(n=0;n<4;i++)
{
while(a[i]!=a[j]&&a[i]!=a[m]&&a[i]!=a[n]&&a[j]!=a[n]&&a[j]!=a[n]&&a[m]!=a[n])
{
printf("%d%d%d%d ",a[i],a[j],a[m],a[n]);
k++;
if(k%4==0)
printf("\n");
}
}
}
}
}
printf("排列种数 :%d",k);
}
为什么不能得到结果,,说是内存不能read,,????????
...全文
337 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
w346581442 2012-06-04
  • 打赏
  • 举报
回复
楼上的语法懂,算法太难了,谁解释啊
sxldfang 2012-06-04
  • 打赏
  • 举报
回复
仅供参考:


#include <stdio.h>
#include<string.h>
void Permutation(char list[], int k, int m)
{
if (k == m)
{
printf("%s\n",list);
}
else
{
char s[10];
int i;
for ( i=k; i <= m; i++)
{
int t;
t=list[k],list[k]=list[i],list[i]=t;
strcpy(s,list+k);
Permutation(list, k+1, m);
strcpy(list+k,s);
}
}
}

void main()
{
char s[]="1234";
Permutation(s, 0, 3);
}


运行结果:

1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
请按任意键继续. . .
fivebinggun 2012-06-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
#include <stdio.h>
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int ……
[/Qu
得到结果是;;123; 132 ;213; 231 ;312; 321; 不符啊!!
w346581442 2012-06-02
  • 打赏
  • 举报
回复
#include <stdio.h>
inline void Swap(char& a, char& b)
{// 交换a和b
char temp = a;
a = b;
b = temp;
}

void Perm(char list[], int k, int m)
{ //生成list [k:m ]的所有排列方式
int i;
if (k == m) {//输出一个排列方式
for (i = 0; i <= m; i++)
putchar(list[i]);
putchar('\n');
}
else // list[k:m ]有多个排列方式
// 递归地产生这些排列方式
for (i=k; i <= m; i++) {
Swap (list[k], list[i]);
Perm (list, k+1, m);
Swap (list[k], list[i]);
}
}

int main()
{
char s[]="123";
Perm(s, 0, 2);
return 0;
}
w346581442 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

C/C++ code

#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;
printf("please in put four numbers :");
for(i=0;i<4;i++)
scanf("%d",&a[i]);
for(i=0;i<4;i++)
{
for(j=0;j<4;j……
[/Quote]
please in put four numbers :3
4
5
6
3445 3446 3456 3465
3546 3554 3556 3564
3645 3654 3664 3665
4335 4336 4356 4365
4536 4553 4556 4563
4635 4653 4663 4665
5334 5336 5346 5364
5436 5443 5446 5463
5634 5643 5663 5664
6334 6335 6345 6354
6435 6443 6445 6453
6534 6543 6553 6554
Press any key to continue


这难道叫全排,
景语 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 2 楼 的回复:
第一:如楼上所说。while造成死循环,直接去掉while!
第二:楼主所有for里面的第三条语句都是i++……复制带来的问题吧!


C/C++ code
#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;

printf("please in put four numbers :");
……
[/Quote]

我以为你要求得A44

赵大大的程序你运行时要带参数

void main(int argc,char**argv) {
if (argc<2) {
printf("%s 要产生全排列的字符串\n",argv[0]);
return;
}
Make_Map(argv[1]);
Find(0);
}
fivebinggun 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
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]

没有错误,也没警告,但最后就是不能得到结果,,直接提示我 press any key to continue,
fivebinggun 2012-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
第一:如楼上所说。while造成死循环,直接去掉while!
第二:楼主所有for里面的第三条语句都是i++……复制带来的问题吧!


C/C++ code
#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;

printf("please in put four numbers :");

……
[/Quote]
应该不能去掉的,,
如你的,,,会有256种
fivebinggun 2012-06-02
  • 打赏
  • 举报
回复
今天一看,,我太粗心了;
1,if;
2,i++;

3 ,while(a[i]!=a[j]&&a[i]!=a[m]&&a[i]!=a[n]&&a[j]!=a[n]&&a[j]!=a[n]&&a[m]!=a[n])
[j]!=a[n]&&a[j]!=a[m],,,这这块有错,
赵4老师 2012-05-29
  • 打赏
  • 举报
回复
#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);
}
自信男孩 2012-05-29
  • 打赏
  • 举报
回复

#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;
printf("please in put four numbers :");
for(i=0;i<4;i++)
scanf("%d",&a[i]);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(m=0;m<4;m++)
{
for(n=0;n<4;i++)
{
if(a[i]!=a[j]&& a[i] != a[m] && a[i] != a[n] && a[j] != a[n] && a[j] != a[n] && a[m] != a[n])
{
printf("%d%d%d%d ",a[i],a[j],a[m],a[n]);
k++;
if(k%4==0)
printf("\n");
}
}
}
}
}

景语 2012-05-29
  • 打赏
  • 举报
回复


第一:如楼上所说。while造成死循环,直接去掉while!
第二:楼主所有for里面的第三条语句都是i++……复制带来的问题吧!

#include<stdio.h>
void main()
{
int a[4],i,j,m,n,k=0;

printf("please in put four numbers :");

for(i=0;i<4;i++)
scanf("%d",&a[i]);

for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
printf("%d%d%d%d ",a[i],a[j],a[m],a[n]);
k++;
if(k%4==0)
printf("\n");
}
}
}
}
printf("排列种数 :%d",k);
}


gcc+linux测试运行无误。
cryingbee 2012-05-27
  • 打赏
  • 举报
回复
while(a[i]!=a[j]&&a[i]!=a[m]&&a[i]!=a[n]&&a[j]!=a[n]&&a[j]!=a[n]&&a[m]!=a[n])
会出现死循环。

改成if

69,371

社区成员

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

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