| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1764 人关注过本帖
标题:一道关于数字的题,请高手帮帮忙,编下代码
只看楼主 加入收藏
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
9 4 CR

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-10 07:54
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
收藏
得分:0 
/* 由于写文件速度很慢,当组合数很多的时候会很慢。如果只要求组合的个数,可以屏蔽掉写文件部分 */
#include <stdio.h>
#include <string.h>

#define N 20

static long icount = 0, inum = 0;
int tmparray[N];
char sFileName[64] = "result.txt";

void swap(int &a, int &b)
{
    int t;
    t = a;
    a = b;
    b = t;
}

/* 比较数组array与tmparray的前num个数是否相同 */
int isequal(int *array, int num)
{
    for(int i = 0; i < num; i ++)
    {
        if(array[i] != tmparray[i])
            return -1;
    }
    return 0;
}

/* 将数组array的数复制到tmparray */
void copy2tmp(int *array, int n)
{
    for(int i = 0; i < n; i ++)
        tmparray[i] = array[i];
}

/* 保存数组的前n个数 */
int savearray(int *array, int n)
{
    FILE *fp;

    if((fp = fopen(sFileName, "a")) == NULL)
    {
        printf("打开文件[%s]失败\n", sFileName);
        return -1;
    }

    for(int i = 0; i < n; i++)
        fprintf(fp, "%-4d", array[i]);
    fprintf(fp, "\n");

    fclose(fp);
   
    return 0;
}

/**
 * 数组array,数组中数个数n,组合数的个数num,当前位置pos
 */
void func(int *array, int n, int num, int pos)
{
    if(pos == n-1)
    {
        icount ++;

        /* 是第一组组合 */
        if(icount == 1)
        {
            copy2tmp(array, n);
            inum ++;
            if(savearray(array, num) < 0)
                return;
        }
        else
        {
            /* 当前组和上一组不同 */
            if(isequal(array, num) != 0)
            {
                copy2tmp(array, n);
                inum ++;
                if(savearray(array, num) < 0)
                    return;
            }
        }
    }
    else
    {
        for(int i = pos; i < n; i ++)
        {
            swap(array[pos], array[i]);
            func(array, n, num, pos+1);
            swap(array[pos], array[i]);
        }
    }
}

int main(int argc, char *argv[])
{
    int array[N] = {1, 3, 5, 8, 9, 10, 15, 20, 24};

    /* 删除上一次运行结果文件 */
    unlink(sFileName);
    
    func(array, 9, 4, 0);

    printf("总组数: %ld\n", inum);

    return 0;
}

[[it] 本帖最后由 josen0205 于 2008-9-10 19:56 编辑 [/it]]

只有想不到,没有做不到
2008-09-10 19:36
xs_cctv
Rank: 1
来 自:湖南
等 级:新手上路
帖 子:21
专家分:0
注 册:2008-8-19
收藏
得分:0 
一个比一个牛
我是新手啊 为什么我是新手
正在向高手努力中
2008-09-10 20:32
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
程序代码:
#include <stdio.h>
#define N 100
int a[N], m, n;

void comb(int t)
{
    int i;
    if (t == m)
    {
        for (i = 0; i < m; i++)
            printf("%d ", a[i]);
        printf("\n");
        return;
    }
    comb(t + 1);
    for (i = t + 1; i < n; i++)
    {
        int tt = a[t];
        a[t] = a[i];
        a[i] = tt;
        comb(t + 1);
        a[i] = a[t];
        a[t] = tt;
    }
}

int main()
{
    while (scanf("%d%d", &n, &m) == 2)
    {
        int i;
        for (i = 0; i < n; i++)
            scanf("%d", &a[i]);
        comb(0);
    }
    return 0;
}



经典题目,何须这么麻烦……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-09-10 20:35
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
收藏
得分:0 
回复 14# StarWing83 的帖子
学习

[[it] 本帖最后由 josen0205 于 2008-9-10 20:45 编辑 [/it]]

只有想不到,没有做不到
2008-09-10 20:40
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
回复 15# josen0205 的帖子
整体思路就是这样。再加个排序和判断就OK
        int tt = a[t];
        a[t] = a[i];
        a[i] = tt;
        comb(t + 1);
        a[i] = a[t];
        a[t] = tt;
尤其经典,快速排序里有类似代码。
不推荐写文件
曾经作了一个字符串排序 共有12个字母,结果写到文件里,后果就是
文件长达6.5g

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-09-10 20:44
liyanhong
Rank: 3Rank: 3
来 自:水星
等 级:禁止访问
威 望:8
帖 子:1867
专家分:0
注 册:2008-5-3
收藏
得分:0 
学习了

爱上你 是 我的错  可是离 开  又舍不得  听着你为我写的歌     好难过
如果说 我说如果  我们还 能  重新来过   不去计 较 谁对谁错  会怎么做
2008-09-10 22:18
XSYCF
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-9-11
收藏
得分:0 
我用的思路是传统的树杈法,不晓得程序是否太繁琐了,请大家指正。
我这个是有考虑顺序的。

[[it] 本帖最后由 XSYCF 于 2008-9-11 19:27 编辑 [/it]]
2008-09-11 19:19
XSYCF
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2008-9-11
收藏
得分:0 
#include<stdio.h>
main()
{    int a[9]={1,3,5,8,9,10,15,20,24};
    int    i,j,m,n,q=0,p=0;
    for(i=0;i<9;i++)                    /*取第一位*/
        {for(j=0;j<9;j++)                /*取第二位*/    
        {while(a[i]==a[j])                /*与第一位相等,指定下一个数*/
        j++;
        if(j>8)
        break;                    /*如果下一个数超出范围,直接跳出到上一个循环*/
            for(m=0;m<9;m++)            /*取第三位*/
            {while(a[i]==a[m]||a[j]==a[m])    /*与前两位相等,指定下一个数*/
            m++;
            if(m>8)
            break;
                for(n=0;n<9;n++)        /*取第四位*/
                {while(a[i]==a[n]||a[j]==a[n]||a[m]==a[n] )            /*与前三位相等,指定下一个数*/
                n++;
                if(n>8)
                break;
                 printf("%d,%d,%d,%d      ",a[i],a[j],a[m],a[n]);q++;p++;    /*打印最终取得的四个数*/
                if(q==5)
                {q=0;
                printf("\n");}                /*为了好看点,规定一行打印5组数字*/
                }}}}
    printf("共有%d个排列\n",p);
}

[[it] 本帖最后由 XSYCF 于 2008-9-11 19:34 编辑 [/it]]
2008-09-11 19:20
shade1220
Rank: 1
等 级:新手上路
帖 子:83
专家分:0
注 册:2008-8-5
收藏
得分:0 
左边开始第一位9种情况
第二位8种
第三位7种
第四位6种
for下.再用一个变量跟踪
ok

踏踏实实学习,认认真真编程
2008-09-11 20:09
快速回复:一道关于数字的题,请高手帮帮忙,编下代码
数据加载中...
 
   



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

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