| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6508 人关注过本帖, 1 人收藏
标题:用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数
只看楼主 加入收藏
棱风柳木
Rank: 2
等 级:论坛游民
帖 子:15
专家分:10
注 册:2009-9-27
结帖率:100%
收藏(1)
 问题点数:0 回复次数:25 
用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: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-11-2
收藏
得分:0 
四重循环试试
for(i=1;i<=9;i++)
   for(j=1;j<=9;j++)
     for(h=1;h<=9;h++)
       for(l=1;l<=9;l++)
       {
         a=i*1000+j*100+h*10+l;
         cout<<a;
        }
2009-11-16 20:57
shl305
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:36
专家分:121
注 册:2009-3-13
收藏
得分:0 
四重循环是可以的,不过要判断四个数两两不同,不能直接输出
2009-11-16 21:32
东陆小生
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2009-11-2
收藏
得分:0 
回复 2楼 东陆小生
对 没看清题意 那就加个判断条件喽
if(i==j || i==h || i==l || j==h || j==l || h==l)
  continue;
然后再
a=~~~~;
cout<<a;
2009-11-16 23:55
flyingcloude
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:6
帖 子:598
专家分:1512
注 册:2008-1-13
收藏
得分:0 
回复 4楼 东陆小生
for(int i=1;i<=9;i++)
{
   for(int j=1;j<=9;j++)
   {
    if(i==j)
        continue;
     for(int h=1;h<=9;h++)
     {
    if(i==h||j==h)
        continue;
       for(int l=1;l<=9;l++)
       {
    if(l==i||l==j||l==h)
        continue;
       }
     }
   }
}

会少一些循环

你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题
2009-11-17 00:14
棱风柳木
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
flyingcloude
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:6
帖 子:598
专家分:1512
注 册:2008-1-13
收藏
得分:0 
回复 6楼 棱风柳木
程序代码:
int NotContains(int *nums,int n,int index)
{
int i;
for(i = 0;i<index;i++)
{
  if(*(nums+i) == n)
   return 0;
}
return 1;
}
单看这段代码,就觉得这个算法的性能不如四重循环

你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题
2009-11-17 18:30
kspliusa
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:98
专家分:178
注 册:2009-9-27
收藏
得分:0 
我的想法:
代码如下:
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    int temp;
    int n[4] = {0};
    int k;
    int count = 0;
    for (int i=1001; i<10000; i++){
        bool flag  = true;
        temp = i;
        k=0;
        while (temp != 0){
             n[k++] = temp % 10;
             temp /= 10;
        }
        for (int j=0; j<k; j++){
            for (int g=j+1; g<k; g++){
                if (n[j] == n[g]||n[j] == 0){
                   flag = false;
                   break;
                }
            }
            if (!flag)
                break;
        }
        if (flag){
            cout<<i<<endl;
            count++;
        }
    }
    cout<<"count = "<<count<<endl;
    return 0;
}
2009-11-17 23:02
kspliusa
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:98
专家分:178
注 册:2009-9-27
收藏
得分:0 
改了一下  思想不变
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    int temp;
    int n[4] = {0};
    int k;
    int count = 0;

    for ( int i = 1001; i < 10000; i++ ){
        bool flag  = true;
        temp = i;
        k = 0;
        while ( temp != 0 ){
            n[k] = temp % 10;
            for (int h=0; h<k;h++){
                if (n[h] == n[k]||n[h]==0){
                    flag = false;
                        break;
                }
            }
            if(!flag)
                break;
            temp /= 10;
            k++;
        }
        if (flag){
            cout << i << endl;
            count++;
        }
    }
    cout << "count = " << count << endl;

    return 0;
}
2009-11-17 23:36
中学者
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:20
帖 子:3554
专家分:80
注 册:2007-9-14
收藏
得分:0 
直接DFS不就好了.
#include <cstdio>
bool isU[9] = {false};
int count_ = 0;
void find(int dep)
{
    if(dep==4) { //find the fourth
        for(int i=0;i<9;++i){
            if(isU[i]==true){
                printf("%d",i+1);
            }
        }
        printf("   ");
        ++ count_ ;
        return ;
     }
     for(int i=0;i<9;++i){
         if(isU[i]==false){
            isU[i] = true;
            find(dep+1);
            isU[i] = false;
          }
     }
}
int main()
{
     find(0);
     printf("\nThe Sum is %d\n",count_);
     return 0;
}

樱花大战,  有爱.
2009-11-18 11:58
快速回复:用1,2,3,4,5,6,7,8,9这9个数,不能重复使用,组成四位数
数据加载中...
 
   



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

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