四重循环也太简单了吧
我在百度知道上提问 有一个叫 aund1986回答;
#include<stdio.h>
void MakeNums(int index,int limit,int pick[],int *nums,int *Index_arr,int *arr,int times);
int NotContains(int *nums,int n,int index);
int MakeNum(int nums[],int limit);
int main()
{
int i;
int Index_arr = 0,arr[3024],nums[4];
int pick[10]={1,2,3,4,5,6,7,8,9,'\0'};
int t = sizeof(arr);
MakeNums(0,4,pick,nums,&Index_arr,arr,3024);
for(i = 0;i<Index_arr;i++)
printf("%d\n",arr[i]);
return 0;
}
/*
index:位数下标,用于标识现在循环到了某次整数的第几位
limit:标志是几位数
pick:筛选序列,pick以'\0'结尾
nums:存放整数的每一位的数组
Index_arr:作为最终存放所有符合条件的生成数的数组的下标
arr:存放所有的数
times:生成多少个数,没有本参数程序正常运行,但是某种情况下会降低性能
*/
void MakeNums(int index,int limit,int pick[],int *nums,int *Index_arr,int *arr,int times)
{
int i;
if(index < limit)
{
for(i = 0;pick[i]!='\0';i++)
if(NotContains(nums,pick[i],index) == 1)
{
*(nums+index) = pick[i];
MakeNums(index+1,limit,pick,nums,Index_arr,arr,times);
}
}
else if(index == limit)
{
*(arr+*Index_arr) = MakeNum(nums,limit);
(*Index_arr)++;
if(*Index_arr == times)
{
return;
}
}
}
/*
判断某个数是否在数组中
nums:数组
n:某个数
index:需要判断到数组的第几个元素
*/
int NotContains(int *nums,int n,int index)
{
int i;
for(i = 0;i<index;i++)
{
if(*(nums+i) == n)
return 0;
}
return 1;
}
/*
利用数组累加生成整数
nums:数组
limit:生成几位数
*/
int MakeNum(int nums[],int limit)
{
int i,sum = 0;
for(i = 0;i<limit;i++)
sum = sum*10+nums[i];
return sum;
}
给大家分享下
还有没有比这更好的算法