| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2515 人关注过本帖, 1 人收藏
标题:C语言程序问题,穷尽所有数字的如下排列。
只看楼主 加入收藏
蔡致润
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-10-21
结帖率:50%
收藏(1)
已结贴  问题点数:20 回复次数:14 
C语言程序问题,穷尽所有数字的如下排列。
1.        1

2.        11
        2

3.        111
        21
        3

4.        1111
        211
        22
        31
        4

5.        11111
        2111
        221
        311
        32
        41
        5

6.        111111
        21111
        2211
        222
        3111
        321
        33
        411
        42
        51
        6

7.        1111111
        211111
        22111
        2221
        31111
        3211
        322
        331
        4111
        421
        43
        511
        52
        61
        7

如题,按照上述方式将数字的排列穷尽,用数组分别存储每个数字的所有排列,至少能够达到数字30。请高人解答
搜索更多相关主题的帖子: C语言 
2017-01-26 11:58
蔡致润
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-10-21
收藏
得分:0 
若能给出类似的程序或者算法也行,谢谢
2017-01-26 12:00
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:1 
有规律的~
可以这样理解~
第一批~由数字1组成~
第二批~由数字2 1组成~
第三批~由数字3 2 1组成~
以此类推~
然后取数时按数字由大到小取~
以7为例~
输出排列以
1111111
2221
22111
211111
331
322
3211
31111
43
421
4111
52
511
61
7
感觉这样规律性更强~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-26 12:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:1 
还是以7为例~
感觉这样穷举规律性更强~
7
61
52
511
43
421
4111
331
322
3211
31111
2221
22111
211111
1111111
抓住1是不能再分解的性质就容易理解了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-26 13:22
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:18 
求所有可能的个数的话,可以DP求解,打印所有可能就只有dfs了。


程序代码:
#include <stdio.h>

void show(int sa[], int len)
{
    for (int i = 0; i < len; ++i)
    {
        printf("%d%c", sa[i], "\n "[i < len - 1]);
    }
}

void fun(int sa[], int p, int n)
{
    if (!n) show(sa, p);
    for (int i = 1; i <= n; ++i)
    {
        if (p && i > sa[p - 1]) break;

        sa[p] = i;
        fun(sa, p + 1, n - i);
    }
}

int main()
{
    int n;

    while (1 == scanf("%d", &n))
    {
        int sa[n];
        fun(sa, 0, n);
    }
    return 0;
}



[fly]存在即是合理[/fly]
2017-01-26 14:18
蔡致润
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-10-21
收藏
得分:0 
回复 5楼 azzbcc
谢谢

[此贴子已经被作者于2017-1-26 15:20编辑过]

2017-01-26 14:46
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 6楼 蔡致润
利用论坛的搜索功能,也许有你想要的答案。怕就怕你想学不用心

早知做人那么辛苦!  当初不应该下凡
2017-01-26 14:56
蔡致润
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-10-21
收藏
得分:0 
回复 7楼 炎天
谢谢你的建议。
2017-01-26 15:05
蔡致润
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2014-10-21
收藏
得分:0 
回复 7楼 炎天
能请教你个问题吗?
printf("%d%c", sa[i], "\n "[i < len - 1]);
这里的后半部分"\n "[i < len - 1]看不明白,以前从来没有遇到过,觉得像是一个条件判断,测试结果也差不多,想问下出处在哪里。
2017-01-26 15:51
炎天
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:桃花岛
等 级:贵宾
威 望:29
帖 子:1218
专家分:4986
注 册:2016-9-15
收藏
得分:0 
回复 9楼 蔡致润
先告诉你我的见解
"*&"[ ]   括号里为真执行第一个字符 * , 为假执行第二个字符 &
自己琢磨的,不太详尽

早知做人那么辛苦!  当初不应该下凡
2017-01-26 19:46
快速回复:C语言程序问题,穷尽所有数字的如下排列。
数据加载中...
 
   



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

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