24小时热门版块排行榜    

查看: 2451  |  回复: 19
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

holmescn

金虫 (正式写手)

[交流] Euler 工程 第廿四题:全排列的第100万项 已有5人参与

一个排列是一组对象的一个有序排列。比如3123是数字1、2、3和4的一个可能的排列。如果把所有的排列按照其数字or字母的大小顺序都列出来,那就成为一个全排列。比如0、1、2的全排列是:
012 021 102 120 201 210

那么,数字0、1、2、3、4、5、6、7、8和9的全排列的第100万项是多少?
回复此楼

» 猜你喜欢

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

qinghuoly

木虫 (正式写手)

★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
xzhdty(金币+1): 谢谢 2011-06-28 00:11:19
引用回帖:
Originally posted by holmescn at 2011-06-27 09:30:55:
这东西可读性很差啊,又不数学,又不自然语言,不觉得有什么美的。和Brain Fuck那个语言差不多。

我解释一下程序:

perm=: i. @ ! A. i.
定义算子perm
按照语法展开perm n(n为任意正整数)为:
  (i. ! n) A. (i. n)
其中i. n 产生一个列表,0, 1, 2, ... n-1,共n项。
i. ! n 产生列表,0, 1, 2, ... n的阶乘-2, n的阶乘-1,共 n! 项。
A. 的用法为:x A. y 表示以x为索引建立列表y中元素的排列。

于是perm 10 即以字典序排列的0-9这十个数字全部排列。

x {:: y 表示提取y中的第x项。从第0项开始计数
所以(1e6-1){::perm 10 展开为
(1000000 - 1) {:: (i. ! 10) A. (i. 10)
天地为帐,日月为灯,风雷为号角,云虹为旗令,山川为阵图,草木为兵卒。运阴阳五行为谋,策古今兴替为略。
18楼2011-06-27 23:39:12
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 20 个回答

huycwork

金虫 (著名写手)

★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:51:26
C++蛮力版代码:
CODE:
#include
#include
#include
using namespace std;

bool next_digit(char *first, char *last, char *end){
        char *left, *right;
        if(last-first<2){
                return false;
        }
        for(right = last; right > first; --right){
                for(left = right-1; left >= first; --left){
                        if(*left < *right){
                                if(!next_digit(left+1, right, end)){
                                        swap(*left, *right);
                                        sort(left+1, end);
                                        return true;
                                }else
                                        return true;
                        }
                }
        }
        return false;
}

string eular24(const string &str){
        char *base = const_cast(str.c_str());
        for(size_t i = 1; i < 1000000; ++i)
                next_digit(base, base+str.length()-1, base+str.length());
        return str;
}

int main(){
        cout<         return 0;
}

漩涡的中心有一块空地,空空的。
2楼2011-06-10 11:45:00
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huycwork

金虫 (著名写手)

★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+3): 谢谢分享~~ 2011-06-10 21:51:54
非蛮力版也有,不过不是自己想出来的,就不好意思直接贴代码了,基本想法就是数制的扩展:
二进制数制是这个样子:
a1*2^n+a2*2^(n-1)+...+an*2^1+a*2^0
十进制数制是这样子:
b1*10^n+b2*10^(n-1)+...+bn*10^1+b*10^0
那我们可以考虑阶乘进制:
c1*n!+c2*(n-1)!+...+cn*1!+c*0!
不过阶乘有点问题就是1!是1,0!是0,那就失去了最后一个的意义,所以最后一个去掉:
c1*n!+c2*(n-1)!+...+cn*1!+c
那前面的6个数就依次是:
0=0*2!+0*1!+0 => 012
1=0*2!+1*1!+0 => 021
2=1*2!+0*1!+0 => 102
3=1*2!+1*1!+0 => 120
4=2*2!+0*1!+0 => 201
5=2*2!+1*1!+0 => 210
上面的计算当然跟一般的进制计算不同,一般的进制计算是要求前面的数不能大过模数,二进制的前缀只能是0和1,十进制的前缀只能是0~9,而阶乘进制的前缀就只能是0~n,n是指后面的n!,以3=>120为例,前面的运算应该是这样子:
2!:012,前缀就是take out的索引,例子的是1
1!:02,例子中的是1,拿走的就是2
0!:0,剩下来的没得选择,这也是每个末尾都是0的原因
组合起来就是120
漩涡的中心有一块空地,空空的。
3楼2011-06-10 12:04:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

wangww2011

木虫 (著名写手)

★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:52:10
c语言非蛮力版
当时就乱写了个 也不清楚和上面的算法一样不一样
CODE:
#include
#include


char *euler24(int n){
        int a[10],i,j,i0;
        a[0]=1;
        for(i=1;i<10;i++)a[i]=a[i-1]*(i+1);

        for(i=0;i<10;i++){
                if(a[i]>=n){
                        i0=i+1;break;
                }
        }

        int b[i0];
        for(i=i0-2;i>=0;i--){
                b[i]=n/a[i];
                n%=a[i];
                if(n==0){
                        b[i]--;
                        n=a[i];
                }
        }  

        int p[i0];
        char str[i0+1];
        for(i=0;i
        for(i=0;i                 str[i]=p[b[i0-i-2]]+48;
                for(j=b[i0-i-2];j                         p[j]=p[j+1];
     
        }
        str[i0-1]=p[0]+48;
        str[i0]='\0';

        return strdup(str);
}


int main(void){

        printf("%s\n",euler24(1000000));

        return 0;
}

[ Last edited by wangww2011 on 2011-6-10 at 13:28 ]
4楼2011-06-10 13:24:31
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 中青基了要发朋友圈吗? +7 349506619 2026-08-28 7/350 2026-08-31 13:39 by 冼亮淀粉酶
[基金申请] 投票:  有多少人是今天查系统知道结果的? +17 爱看书的可乐 2026-08-26 19/950 2026-08-31 11:51 by xiangy672
[基金申请] 基金不中,共勉 +12 eulota 2026-08-26 12/600 2026-08-31 08:42 by ZJTJZ
[基金申请] 有没有仍没收到信息的 +7 德尚中行 2026-08-27 8/400 2026-08-30 20:52 by purplejack
[基金申请] 麻烦专家们看看评委们的意见(F口面上) +6 gdd2018 2026-08-28 11/550 2026-08-30 08:58 by 超级无敌华子
[基金申请] 国自然面上复盘~欢迎讨论 (金币+15) +15 晴天加油 2026-08-26 16/800 2026-08-29 18:28 by symmetry
[基金申请] 2026年叶企孙基金 +4 bud_bud 2026-08-27 7/350 2026-08-29 07:23 by foolishmani
[基金申请] 系统查不到 +11 董八千 2026-08-26 11/550 2026-08-28 18:06 by Leogzhya
[基金申请] 基金系统什么内容也没有 30+4 winsaint 2026-08-27 9/450 2026-08-28 11:06 by maolC
[基金申请] 怎么查啊 +6 huang1991js 2026-08-26 6/300 2026-08-28 08:42 by winsaint
[基金申请] 看板上这么多中的,有点像50人群里49个人都是骗子的那种感觉…… +5 a089 2026-08-26 6/300 2026-08-27 14:05 by jonewore
[基金申请] 为什么 国际(地区)合作与交流项目 没有放榜? 10+3 majunge000 2026-08-26 11/550 2026-08-27 08:42 by 北京莱茵编辑
[基金申请] 2026年8月25日国自然放榜前突然收到列入评审专家邮件,有关系吗? +25 木水思豆 2026-08-25 28/1400 2026-08-26 14:53 by draco1987
[基金申请] 出来了 +9 trojank 2026-08-26 9/450 2026-08-26 14:25 by 宝贝虫子
[基金申请] 为什么国自然不能直接公布 +4 bjdxyxy 2026-08-26 4/200 2026-08-26 13:12 by qingmu1201
[基金申请] 国合可查了 +3 paperzjh 2026-08-26 3/150 2026-08-26 10:41 by LemmonTr
[基金申请] 今天务委会开完了,明天出结果吗 +19 angus9576 2026-08-25 23/1150 2026-08-26 10:03 by zp519
[基金申请] 在坚冰还盖着北海的时候,我看到了怒放的梅花。 (金币+10) +6 ziyangfang 2026-08-25 9/450 2026-08-25 20:26 by huagongfeihu
[基金申请] 某些机构,以效率低为荣,以效率低作为存在感 +9 yuleib84 2026-08-25 10/500 2026-08-25 17:14 by alexon
[基金申请] 没有任何消息-是不是就凉了 +9 图啦图啦 2026-08-24 10/500 2026-08-25 11:59 by 南海小哥
信息提示
请填处理意见