用C语言和数据结构编写一个简单的程序(求源代码)
用C语言和数据结构编写一个:一个不大于六位的数字,列出这个数字数位的任意组合。例如:输入1,2,3三个数,输出的三位数组就是:123,132,213,231,321,31...
用C语言和数据结构编写一个:一个不大于六位的数字,列出这个数字数位的任意组合。
例如:输入1,2,3三个数,输出的三位数组就是:123,132,213,231,321,312。
程序的要求是输入数字个数必须不超过六个(可以少于六个),然后显示所有的组合形式。
急求源代码!!!
非常感谢!!! 展开
例如:输入1,2,3三个数,输出的三位数组就是:123,132,213,231,321,312。
程序的要求是输入数字个数必须不超过六个(可以少于六个),然后显示所有的组合形式。
急求源代码!!!
非常感谢!!! 展开
9个回答
展开全部
/*使用递归,理论上说可以对任意多位数组合,但位数太多了,可能发生堆栈溢出.
以下程序在VC++6.0中编译通过.
*/
#include <stdio.h>
#include <string.h>
#define MAX_NUMBER 6 //修改这个参数来允许最大的位数,现设为6位
void GetZhe (const char * preStr,const char * strNum)
{
char newPreStr[MAX_NUMBER];
char tmpStr[MAX_NUMBER];
int i,j,k,iCnt;
k = strlen(strNum);
if (k>MAX_NUMBER) {
printf("超过最大允许的位数:%d!",MAX_NUMBER);
return ;
}
switch(k)
{
case 0:
return;
case 1:
strcpy(tmpStr,preStr);
strcat(tmpStr,strNum);
printf("%s\r\n",tmpStr);
break;
default:
tmpStr[0] = 0;
for (i=0;i<k;i++)
{
strcpy(newPreStr,preStr);
j = strlen(newPreStr);
newPreStr[j] = strNum[i];
newPreStr[j+1] = 0;
iCnt = 0;
for (j=0;j<k;j++)
{
if(j != i)
{
tmpStr[iCnt] = strNum[j];
iCnt ++ ;
}
}
tmpStr[iCnt] = 0;
GetZhe(newPreStr,tmpStr);
}
}
}
int main(int argc, char* argv[])
{
GetZhe("","123456");
return 0;
}
以下程序在VC++6.0中编译通过.
*/
#include <stdio.h>
#include <string.h>
#define MAX_NUMBER 6 //修改这个参数来允许最大的位数,现设为6位
void GetZhe (const char * preStr,const char * strNum)
{
char newPreStr[MAX_NUMBER];
char tmpStr[MAX_NUMBER];
int i,j,k,iCnt;
k = strlen(strNum);
if (k>MAX_NUMBER) {
printf("超过最大允许的位数:%d!",MAX_NUMBER);
return ;
}
switch(k)
{
case 0:
return;
case 1:
strcpy(tmpStr,preStr);
strcat(tmpStr,strNum);
printf("%s\r\n",tmpStr);
break;
default:
tmpStr[0] = 0;
for (i=0;i<k;i++)
{
strcpy(newPreStr,preStr);
j = strlen(newPreStr);
newPreStr[j] = strNum[i];
newPreStr[j+1] = 0;
iCnt = 0;
for (j=0;j<k;j++)
{
if(j != i)
{
tmpStr[iCnt] = strNum[j];
iCnt ++ ;
}
}
tmpStr[iCnt] = 0;
GetZhe(newPreStr,tmpStr);
}
}
}
int main(int argc, char* argv[])
{
GetZhe("","123456");
return 0;
}
展开全部
我是用递归写的
代码如下
如果合适的话我可以添加注释
#include <stdio.h>
void Combinate(char* str, char* strHead)
{
int i;
char _tmp[100] = {NULL}, _tmp2[100] = {NULL}, _ch[2] = {NULL};
if(!str)
return;
if(strlen(str) == 1)
{
strcpy(_tmp, strHead);
strcat(_tmp, str);
printf("%s\n", _tmp);
return;
}
strcpy(_tmp, "");
for(i = 0; i < strlen(str); i++)
{
strcpy(_tmp, str);
_tmp[i] = NULL;
strcat(_tmp, _tmp + i + 1);
_ch[0] = str[i];
strcpy(_tmp2, strHead);
strcat(_tmp2, _ch);
Combinate(_tmp, _tmp2);
}
}
int main()
{
char str[100] = {NULL};
scanf("%s", str);
str[6] = NULL;
printf("You have typed %s\nAnd the result is:\n\n", str);
Combinate(str, "");
}
比如当输入123时
输出为
You have typed 123
And the result is:
123
132
213
231
312
321
输入1234
输出为
You have typed 1234
And the result is:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
代码如下
如果合适的话我可以添加注释
#include <stdio.h>
void Combinate(char* str, char* strHead)
{
int i;
char _tmp[100] = {NULL}, _tmp2[100] = {NULL}, _ch[2] = {NULL};
if(!str)
return;
if(strlen(str) == 1)
{
strcpy(_tmp, strHead);
strcat(_tmp, str);
printf("%s\n", _tmp);
return;
}
strcpy(_tmp, "");
for(i = 0; i < strlen(str); i++)
{
strcpy(_tmp, str);
_tmp[i] = NULL;
strcat(_tmp, _tmp + i + 1);
_ch[0] = str[i];
strcpy(_tmp2, strHead);
strcat(_tmp2, _ch);
Combinate(_tmp, _tmp2);
}
}
int main()
{
char str[100] = {NULL};
scanf("%s", str);
str[6] = NULL;
printf("You have typed %s\nAnd the result is:\n\n", str);
Combinate(str, "");
}
比如当输入123时
输出为
You have typed 123
And the result is:
123
132
213
231
312
321
输入1234
输出为
You have typed 1234
And the result is:
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
#include "stdio.h"
void main()
{
char a[6];
int i=0,j,k,s,p;
printf("please intput num:\n");
while((ch=getch())!='\r')
{
a[++i]=ch;
if(i==6)
{ printf("only can input 6 wei shu!\n"); break;}
}
for(i=0;i<6;i++)
for(j=0;j!=i;j++)
for(k=0;k!=i&&k!=j;k++)
for(s=0;s!=i&&s!=j&&s!=k;s++)
for(p=0;p!=i&&p!=j&&p!=k&&p!=s;p++)
printf("%d%d%d%d%d%d ",a[i],a[j],a[k],a[s],a[p]);
}
void main()
{
char a[6];
int i=0,j,k,s,p;
printf("please intput num:\n");
while((ch=getch())!='\r')
{
a[++i]=ch;
if(i==6)
{ printf("only can input 6 wei shu!\n"); break;}
}
for(i=0;i<6;i++)
for(j=0;j!=i;j++)
for(k=0;k!=i&&k!=j;k++)
for(s=0;s!=i&&s!=j&&s!=k;s++)
for(p=0;p!=i&&p!=j&&p!=k&&p!=s;p++)
printf("%d%d%d%d%d%d ",a[i],a[j],a[k],a[s],a[p]);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
/*
使用单链表
输入时数字以空格隔开,以回车结束
*/
#include"stdio.h"
typedef struct node
{
int num;
node *next;
int checked;
}lnode,*llist;
void main()
{
char ch;
llist l=NULL;
lnode *t;
int checkedcount,rcount;
int a[6],i,j,k,record[1000]={0},n=1;
int b[6]={1,10,100,1000,10000,100000};
ch=' ';
i=0;
printf("输入数字:");
while(ch!='\n')
{
lnode *p=new lnode;
scanf("%d",&p->num);
p->next=l;
l=p;
i++;
ch=getchar();
}
rcount=0;
for(j=1;j<i;j++)
n*=10;
for(j=n;j<10*n;j++)
{
checkedcount=0;
for(t=l;t!=NULL;t=t->next)
t->checked=0;
for(k=0;k<i;k++)
{
a[k]=(j/b[k])%10;
for(t=l;t!=NULL;t=t->next)
if(t->num==a[k]&&t->checked==0)
{
t->checked=1;
checkedcount++;
break;
}
}
if(checkedcount==i)
{
record[rcount]=j;
rcount++;
}
}
for(j=0;j<rcount;j++)
printf("%-6d ",record[j]);
printf("\n");
}
使用单链表
输入时数字以空格隔开,以回车结束
*/
#include"stdio.h"
typedef struct node
{
int num;
node *next;
int checked;
}lnode,*llist;
void main()
{
char ch;
llist l=NULL;
lnode *t;
int checkedcount,rcount;
int a[6],i,j,k,record[1000]={0},n=1;
int b[6]={1,10,100,1000,10000,100000};
ch=' ';
i=0;
printf("输入数字:");
while(ch!='\n')
{
lnode *p=new lnode;
scanf("%d",&p->num);
p->next=l;
l=p;
i++;
ch=getchar();
}
rcount=0;
for(j=1;j<i;j++)
n*=10;
for(j=n;j<10*n;j++)
{
checkedcount=0;
for(t=l;t!=NULL;t=t->next)
t->checked=0;
for(k=0;k<i;k++)
{
a[k]=(j/b[k])%10;
for(t=l;t!=NULL;t=t->next)
if(t->num==a[k]&&t->checked==0)
{
t->checked=1;
checkedcount++;
break;
}
}
if(checkedcount==i)
{
record[rcount]=j;
rcount++;
}
}
for(j=0;j<rcount;j++)
printf("%-6d ",record[j]);
printf("\n");
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
有难度
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询