全排列问题--萌新的方法

作为一个刚接触C程不久的学生,我表示CSDN里大神们用的解题方式好多都不明其意

所以我决定用自己的想法来尝试

at first:

我意图降低难度,编写一个可以有重复的全排列。

因此我想把它做成一个数,是以n(个数)为进制数的一串数,输出

然而我发现要做未知量进制的进制转化代码太过麻烦

second:

我想用二位数组解决,但是并没*用;

然后我开始看了一下大神们的代码233

#include<cstdio>

#include<iostream>

这种代码抬头你让我一个刚看完谭浩强的红皮书的大一学生怎么理解

thrid:

在我的不断努力下还是找到了一种思路:

交换一个从赋值为1到n的一维数组。详情见(https://blog.csdn.net/qq_33901297/article/details/52134672

但是....这解决了全排列,可是简单地有重复的问题却没有解决

finally:

我决定按照一维数组的想法自食其力,在一维数组的条件下完成n进制的情况

思路:

设定一个一维n项数组,给每一项设定初始值1;

让n-1项的值一直加一,当它的值大于n时让n-2的值加一,同理用遍历达成,还完成了n进制的问题

然后用一个标记,记录数组中出现相同数字的次数,如果次数>0,则不打印这一串数组,反之打印;

最后用一个条件,当数组中的数大于最终值时,停止函数,防止函数无限循环。


最终代码为

#include<stdio.h>

int main ( ) {

     voidprint(int *a,int n);

     inta[10];

     intn,i;

     scanf("%d",&n);

     for(i=0;i<n;i++){

          a[i]=1;

     }

     print(a,n);

     return0;

}

 

void print(int *a,int n){

     inti,sum=0,k,flag=0;

     for(i=0;i<n-1;i++){

          for(k=i+1;k<n;k++){

               if(a[i]==a[k])    {

                    flag++;

               }

          }

     }

     if(flag==0){

          for(i=0;i<n;i++){

               printf("%d",a[i]);   

          }

          printf("\n");

     }

     a[n-1]+=1;

     for(i=n-1;i>=0;i--){

          if(a[i]>n){

               a[i]=1;

               a[i-1]+=1;  

          }

     }

     for(i=0;i<n;i++){

          sum+=*(a+i);

     }

     if(sum!=n*n)    print(a,n);

     else    return;   

}

同理转化为有重复的全排列也是可以进行的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值