作为一个刚接触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;
}
同理转化为有重复的全排列也是可以进行的