求从1到n中选择5个数,求其非递减序的排列个数

fredshao 2013-12-12 09:45:16
求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的)
请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
...全文
386 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-12-13
  • 打赏
  • 举报
回复
//http://bbs.csdn.net/topics/390667169
//1到1中选5个数:1
//11111
//共1种,
//1到2中选5个数:12 2 2 2 2
//11111                   A
//11112
//11122
//11222
//12222
//22222
//共6种,
//1到3中选5个数:123 23 3 23 3 3 23 3 3 3 233333
//11111                                   A
//11112
//11113
//11122
//11123
//11133
//11222
//11223
//11233
//11333
//12222
//12223
//12233
//12333
//13333
//22222
//22223
//22233
//22333
//23333
//33333
//共21种,
//1到4中选5个数:1234 234 34 4 234 34 4 34 4 4 234 34 4 34 4 4 34 4 4 4  234 34 4 34 4 4 34 4 4 4 344444
//11111                                                                  A
//11112
//11113
//11114
//11122
//11123
//11124
//11133
//11134
//11144
//11222
//11223
//11224
//11233
//11234
//11244
//11333
//11334
//11344
//11444
//12222
//12223
//12224
//12233
//12234
//12244
//12333
//12334
//12344
//12444
//13333
//13334
//13344
//13444
//14444
//22222
//22223
//22224
//22233
//22234
//22244
//22333
//22334
//22344
//22444
//23333
//23334
//23344
//23444
//24444
//33333
//33334
//33344
//33444
//34444
//44444
//共56种,
//1到5中选5个数:12345 2345 345 45 5 2345 345 45 5 345 45 5 45 5 5 2345 345 45 5 345 45 5 45 5 5 345 45 5 45 5 5 45 5 5 5  2345 345 45 5 345 45 5 45 5 5 345 45 5 45 5 5 45 5 5 5 345 45 5 45 5 5 45 5 5 5 455555
//11111                                                                                                                    A
//11112
//11113
//11114
//11115
//11122
//11123
//11124
//11125
//11133
//11134
//11135
//11144
//11145
//11155
//11222
//11223
//11224
//11225
//11233
//11234
//11235
//11244
//11245
//11255
//11333
//11334
//11335
//11344
//11345
//11355
//11444
//11445
//11455
//11555
//12222
//12223
//12224
//12225
//12233
//12234
//12235
//12244
//12245
//12255
//12333
//12334
//12335
//12344
//12345
//12355
//12444
//12445
//12455
//12555
//13333
//13334
//13335
//13344
//13345
//13355
//13444
//13445
//13455
//13555
//14444
//14445
//14455
//14555
//15555
//22222
//22223
//22224
//22225
//22233
//22234
//22235
//22244
//22245
//22255
//22333
//22334
//22335
//22344
//22345
//22355
//22444
//22445
//22455
//22555
//23333
//23334
//23335
//23344
//23345
//23355
//23444
//23445
//23455
//23555
//24444
//24445
//24455
//24555
//25555
//33333
//33334
//33335
//33344
//33345
//33355
//33444
//33445
//33455
//33555
//34444
//34445
//34455
//34555
//35555
//44444
//44445
//44455
//44555
//45555
//55555
//共126种,
//1到6中选5个数:123456 23456 3456 456 56 6 23456 3456 456 56 6 3456 456 56 6 456 56 6 56 6 6 23456 3456 456 56 6 3456 456 56 6 456 56 6 56 6 6 3456 456 56 6 456 56 6 56 6 6 456 56 6 56 6 6 56 6 6 6  23456 3456 456 56 6 3456 456 56 6 456 56 6 56 6 6 3456 456 56 6 456 56 6 56 6 6 456 56 6 56 6 6 56 6 6 6 3456 456 56 6 456 56 6 56 6 6 456 56 6 56 6 6 56 6 6 6 456 56 6 56 6 6 56 6 6 6 566666
//11111                                                                                                                                                                                                 A
//11112
//11113
//11114
//11115
//11116
//11122
//11123
//11124
//11125
//11126
//11133
//11134
//11135
//11136
//11144
//11145
//11146
//11155
//11156
//11166
//11222
//11223
//11224
//11225
//11226
//11233
//11234
//11235
//11236
//11244
//11245
//11246
//11255
//11256
//11266
//11333
//11334
//11335
//11336
//11344
//11345
//11346
//11355
//11356
//11366
//11444
//11445
//11446
//11455
//11456
//11466
//11555
//11556
//11566
//11666
//12222
//12223
//12224
//12225
//12226
//12233
//12234
//12235
//12236
//12244
//12245
//12246
//12255
//12256
//12266
//12333
//12334
//12335
//12336
//12344
//12345
//12346
//12355
//12356
//12366
//12444
//12445
//12446
//12455
//12456
//12466
//12555
//12556
//12566
//12666
//13333
//13334
//13335
//13336
//13344
//13345
//13346
//13355
//13356
//13366
//13444
//13445
//13446
//13455
//13456
//13466
//13555
//13556
//13566
//13666
//14444
//14445
//14446
//14455
//14456
//14466
//14555
//14556
//14566
//14666
//15555
//15556
//15566
//15666
//16666
//22222
//22223
//22224
//22225
//22226
//22233
//22234
//22235
//22236
//22244
//22245
//22246
//22255
//22256
//22266
//22333
//22334
//22335
//22336
//22344
//22345
//22346
//22355
//22356
//22366
//22444
//22445
//22446
//22455
//22456
//22466
//22555
//22556
//22566
//22666
//23333
//23334
//23335
//23336
//23344
//23345
//23346
//23355
//23356
//23366
//23444
//23445
//23446
//23455
//23456
//23466
//23555
//23556
//23566
//23666
//24444
//24445
//24446
//24455
//24456
//24466
//24555
//24556
//24566
//24666
//25555
//25556
//25566
//25666
//26666
//33333
//33334
//33335
//33336
//33344
//33345
//33346
//33355
//33356
//33366
//33444
//33445
//33446
//33455
//33456
//33466
//33555
//33556
//33566
//33666
//34444
//34445
//34446
//34455
//34456
//34466
//34555
//34556
//34566
//34666
//35555
//35556
//35566
//35666
//36666
//44444
//44445
//44446
//44455
//44456
//44466
//44555
//44556
//44566
//44666
//45555
//45556
//45566
//45666
//46666
//55555
//55556
//55566
//55666
//56666
//66666
//共252种,
//1到7中选5个数:
//……
//从1到n中选5个数,求其非递减序可重复数字的排列的个数
#include <stdio.h>
int data[8];
int count(int b) {
    int k,r;
    r=0;
    for (k=0;k<b-2;k++) r+=data[k];
    return r;
}
int sum1to(int m) {
    return (1+m)*m/2;
}
int main() {
    int n,t,i,j,d;

    data[0]=6;
    for (d=1;d<=7;d++) {
        t=0;
        for (i=d+2;i>=1;i--) {
            for (j=i;j>=1;j--) {
                t=t+sum1to(j);
            }
        }
        data[d]=t;
    }
    while (1) {
        printf("Input n(1..9):");fflush(stdout);
        rewind(stdin);
        scanf("%d",&n);
        if (1<=n && n<=9) break;
    }
    if (n==1) t=1;
    else if (n==2) t=data[0];
    else if (n>2) t=data[n-2]+count(n);
    printf("%d\n",t);
    return 0;
}
//Input n(1..9):1
//1
//Input n(1..9):2
//6
//Input n(1..9):3
//21
//Input n(1..9):4
//56
//Input n(1..9):5
//126
//Input n(1..9):6
//252
//Input n(1..9):7
//462
//Input n(1..9):8
//792
//Input n(1..9):9
//1287
//
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
n=4时咋办?!
图灵狗 2013-12-12
  • 打赏
  • 举报
回复
个数就是从n中取5的组合数(C(n, 5))。
引用 楼主 wxyztuv 的回复:
求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
自己总结规律 或参考《排列组合》、《概率论与数理统计》 或写个递归程序
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
fredshao 2013-12-12
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
1到1中选5个数:
11111
共1种,
1到2中选5个数:
11111
11112
11122
11222
12222
22222
共6种,
1到3中选5个数:
11111
11112
11113
11122
11123
11133
11222
11223
11233
11333
12222
12223
12233
12333
13333
22222
22223
22233
22333
23333
33333
共21种,
1到4中选5个数:
……
我知道这样,我想知道通用的计算公式是什么,例如我想求从1到100中选8个数,用程序遍历求个数太慢了。 问题:从1到n中选m个数,求其非递减序可重复数字的排列的个数
赵4老师 2013-12-12
  • 打赏
  • 举报
回复
1到1中选5个数:
11111
共1种,
1到2中选5个数:
11111
11112
11122
11222
12222
22222
共6种,
1到3中选5个数:
11111
11112
11113
11122
11123
11133
11222
11223
11233
11333
12222
12223
12233
12333
13333
22222
22223
22233
22333
23333
33333
共21种,
1到4中选5个数:
……
fredshao 2013-12-12
  • 打赏
  • 举报
回复
引用 8 楼 turingo 的回复:
不需要减才对。 [quote=引用 7 楼 wxyztuv 的回复:] [quote=引用 6 楼 turingo 的回复:] n的5次方左右。 [quote=引用 5 楼 wxyztuv 的回复:] [quote=引用 1 楼 turingo 的回复:] 个数就是从n中取5的组合数(C(n, 5))。 [quote=引用 楼主 wxyztuv 的回复:] 求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
[/quote] 如果可以重复,怎么求,例如,可以是12222,123455等,要求个数,如何求?[/quote][/quote] 我一开始想的是用n^5 减去它的排列,即 n^5 - p(n,5),即 不排序不唯一 减去 不排序唯一,但是结果似乎是错的。[/quote][/quote] 是求可重复数字的非递减序排列,如果不减,那只是求了可重复的排列吧,例如n个中选5个,可重复递减序,12344 12222 是可以的,但是 14333 12354就不行了,因为它们中有数字递减了。如何求?
图灵狗 2013-12-12
  • 打赏
  • 举报
回复
不需要减才对。
引用 7 楼 wxyztuv 的回复:
[quote=引用 6 楼 turingo 的回复:] n的5次方左右。 [quote=引用 5 楼 wxyztuv 的回复:] [quote=引用 1 楼 turingo 的回复:] 个数就是从n中取5的组合数(C(n, 5))。 [quote=引用 楼主 wxyztuv 的回复:] 求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
[/quote] 如果可以重复,怎么求,例如,可以是12222,123455等,要求个数,如何求?[/quote][/quote] 我一开始想的是用n^5 减去它的排列,即 n^5 - p(n,5),即 不排序不唯一 减去 不排序唯一,但是结果似乎是错的。[/quote]
fredshao 2013-12-12
  • 打赏
  • 举报
回复
引用 6 楼 turingo 的回复:
n的5次方左右。 [quote=引用 5 楼 wxyztuv 的回复:] [quote=引用 1 楼 turingo 的回复:] 个数就是从n中取5的组合数(C(n, 5))。 [quote=引用 楼主 wxyztuv 的回复:] 求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
[/quote] 如果可以重复,怎么求,例如,可以是12222,123455等,要求个数,如何求?[/quote][/quote] 我一开始想的是用n^5 减去它的排列,即 n^5 - p(n,5),即 不排序不唯一 减去 不排序唯一,但是结果似乎是错的。
图灵狗 2013-12-12
  • 打赏
  • 举报
回复
n的5次方左右。
引用 5 楼 wxyztuv 的回复:
[quote=引用 1 楼 turingo 的回复:] 个数就是从n中取5的组合数(C(n, 5))。 [quote=引用 楼主 wxyztuv 的回复:] 求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
[/quote] 如果可以重复,怎么求,例如,可以是12222,123455等,要求个数,如何求?[/quote]
fredshao 2013-12-12
  • 打赏
  • 举报
回复
引用 1 楼 turingo 的回复:
个数就是从n中取5的组合数(C(n, 5))。 [quote=引用 楼主 wxyztuv 的回复:] 求从1到n中选择5个数,求其非递减序的排列个数,例如,从1到10中,选择5个数,求其非递减序的排列个数,(数字不能重复,例如,123455,是不行的) 请问计算公式是什么,我用递归计算太慢了,当n很大时,例如p(100,5),所以,想知道有没有一个计算公式,可以很快计算出其个数,只需要计算出个数来就OK。
[/quote] 如果可以重复,怎么求,例如,可以是12222,123455等,要求个数,如何求?
bruceteen 2013-12-12
  • 打赏
  • 举报
回复
求从1到n中选择5个数 的数目是 n*(n-1)*(n-2)*(n-3)*(n-4) 这5个数的递减序只有一个 所以结果是 n*(n-1)*(n-2)*(n-3)*(n-4) - 1
bruceteen 2013-12-12
  • 打赏
  • 举报
回复
123455 这个数哪里递减了?或者“非递减序”是如何定义的?

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧