24小时热门版块排行榜    

查看: 2432  |  回复: 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的回帖

holmescn

金虫 (正式写手)

引用回帖:
Originally posted by qinghuoly at 2011-06-27 00:08:17:
优雅如魔鬼的J语言登场:

参考http://www.jsoftware.com/jwiki/Essays/Permutations
CODE:
perm=: i.@! A. i.
n=:1e6-1
n{::perm 10

单行程序:
[code](1e6-1){:i.@!A.i. ...

这东西可读性很差啊,又不数学,又不自然语言,不觉得有什么美的。和Brain Fuck那个语言差不多。
13楼2011-06-27 09:30:55
已阅   回复此楼   关注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的回帖
普通表情 高级回复 (可上传附件)
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[基金申请] 建议基金发布提前给出明确的时间点 +11 kulium 2026-08-21 14/700 2026-08-24 02:12 by 流流伤
[基金申请] 范进中举一文的中心思想 +4 炎黄贵胄 2026-08-22 5/250 2026-08-24 02:09 by 流流伤
[基金申请] 2026国自然函评费到账 +16 羊腰板 2026-08-21 17/850 2026-08-23 23:02 by tianxiaochun
[基金申请] 让我中一个面上吧! +12 大萍1987 2026-08-20 15/750 2026-08-23 20:44 by 大萍1987
[基金申请] 2026年的国家社科基金项目通讯评审的新规则与新动向、新挑战 +4 process2012 2026-08-23 5/250 2026-08-23 19:58 by jurkat.1640
[教师之家] 跳槽后在研项目怎么办? +5 简单化xn 2026-08-22 10/500 2026-08-23 12:38 by 简单化xn
[基金申请] 什么时候开奖? +9 CrisMessi 2026-08-18 10/500 2026-08-23 12:03 by 丶昵称占用
[基金申请] 今天放榜吗? +15 布布和一二 2026-08-19 16/800 2026-08-23 09:55 by 张春生
[基金申请] 只有每年这种时候来逛逛小木虫 +24 yaoyewhu2008 2026-08-20 26/1300 2026-08-22 17:43 by kammury
[基金申请] filecode,4个jtjc了 +13 ziyangfang 2026-08-19 16/800 2026-08-22 17:08 by WH3796
[基金申请] 时间戳今天,20号变了 +5 archvillain 2026-08-20 5/250 2026-08-22 06:12 by hui_daxiao
[基金申请] 今日不放榜?网传国自然预计 8 月 27 日可查结果 +16 医学老男孩 2026-08-20 20/1000 2026-08-21 21:13 by Ldrop2023
[基金申请] 科研孤儿太难了 +17 我4大白菜 2026-08-20 18/900 2026-08-21 20:57 by zhangev
[基金申请] 时间戳又变了 +13 wuchongjun 2026-08-20 19/950 2026-08-21 17:21 by 紫杉醇
[基金申请] 我面上完蛋了 +7 且听虎啸 2026-08-20 8/400 2026-08-21 12:31 by 酷酷墨镜
[论文投稿] 投稿咨询 +5 wwm09 2026-08-17 7/350 2026-08-21 10:11 by 期刊论文帮手
[基金申请] 今天放榜没戏了吧 +9 yuleib84 2026-08-19 11/550 2026-08-21 10:06 by gltch
[基金申请] 基金啊基金 +4 longfie172 2026-08-20 4/200 2026-08-21 08:58 by mark mao
[基金申请] 重要消息,中午系统在维护 +11 yuleib84 2026-08-18 12/600 2026-08-20 11:09 by xskun
[基金申请] 朋友圈看到的 +6 wangzilk 2026-08-18 8/400 2026-08-19 10:55 by Haru815
信息提示
请填处理意见