| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6508 人关注过本帖, 1 人收藏
标题:用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数
取消只看楼主 加入收藏
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
结帖率:100%
收藏(1)
 问题点数:0 回复次数:7 
用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数
用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数(如:1234,4582)
程序实现把所有的可能四位数放到数组arr[3024];//所有四位数的可能是3024

谁有好的算法,不是能实现就行那种.
搜索更多相关主题的帖子: 位数 
2009-11-16 16:16
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
四重循环也太简单了吧
我在百度知道上提问 有一个叫 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;
}
给大家分享下
还有没有比这更好的算法
2009-11-17 14:33
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
先把我在百度知道上的提问放在这吧,让你们也可以看看其他人的回答
http://zhidao.baidu.com/question/125747074.html?quesup1
2009-11-18 15:41
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
回复 10楼 中学者
呵呵 是个不错的算法
2009-11-18 16:38
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
回复 10楼 中学者
偶 认真看了下 怎么和我在6楼发的原理差不了多少的?
2009-11-18 18:40
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
偶这里有两个算法 一个是字典顺序,一个是旋转法;
字典的如下:
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 20
#define SWAP(x,y){int temp;temp=x;x=y;y=temp;}
void main()
{
    int perm[MAXSIZE];
    int last;
    int n;
    int left,right,i,j;
    char line[100];
    gets(line);
    n=atoi(line);
    for(i=0;i<n;i++)
        perm[i]=i+1;
    for(last=0;last>=0;){
        printf("\n");
        for(i=0;i<n;i++)
            printf("%d ",perm[i]);
        for(last=n-2;last>=0&&perm[last]>perm[last+1];last--);
        for(j=n-1;perm[last]>perm[j];j--);
        SWAP(perm[last],perm[j]);
        for(left=last+1,right=n-1;left<right;left++,right--)
            SWAP(perm[left],perm[right]);
    }
}

旋转如下:
#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 20
#define ROTATE(p){                       \
                  int i,temp;            \
                  temp=perm[p];          \
                  for(i=p-1;i>=0;i--)    \
                      perm[i+1]=perm[i]; \
                  perm[0]=temp;          \
                 }
void main()
{
    int perm[MAXSIZE];
    int position;
    int n;
    int i;
    char line[100];
    printf("\nPermutation by Rotation Method");
    printf("\n==============================");
    printf("\n\nNumber of Elements --> ");
    gets(line);
    n=atoi(line);
    for(i=0;i<n;i++)
        perm[i]=i+1;
    position=n-1;
    while(position!=0){
        printf("\n");
        for(i=0;i<n;i++)
            printf("%d ",perm[i]);
        position=n-1;
        ROTATE(position);
        while(perm[position]==position+1&&position!=0){
            position--;
            ROTATE(position);
        }
    }
}
字典的没写输出提示;将就下吧

我想恳请高手帮我改下使它用在这程序;

这两个程序我是在 c语言名题精选百则(技巧篇)冼镜光编著,这里找到的
2009-11-18 19:37
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
这里结贴时间到了,要结贴了,如果谁还想说两句请到这吧!
是同一个问题
http://tieba.baidu.com/f?ct=335675392&tn=baiduPostBrowser&sc=6985510842&z=669413411&pn=0&rn=30&lm=0&word=c#6985510842
2009-11-22 19:25
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
收藏
得分:0 
原来不用结贴咯
2009-11-22 19:27
快速回复:用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017394 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved