| 查看: 1762 | 回复: 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万项是多少? |
» 猜你喜欢
Bioresource Technology期刊,第一次返修的时候被退回好几次了
已经有6人回复
2025冷门绝学什么时候出结果
已经有4人回复
真诚求助:手里的省社科项目结项要求主持人一篇中文核心,有什么渠道能发核心吗
已经有8人回复
寻求一种能扛住强氧化性腐蚀性的容器密封件
已经有5人回复
论文投稿,期刊推荐
已经有6人回复
请问哪里可以有青B申请的本子可以借鉴一下。
已经有4人回复
孩子确诊有中度注意力缺陷
已经有14人回复
请问下大家为什么这个铃木偶联几乎不反应呢
已经有5人回复
请问有评职称,把科研教学业绩算分排序的高校吗
已经有5人回复
天津工业大学郑柳春团队欢迎化学化工、高分子化学或有机合成方向的博士生和硕士生加入
已经有4人回复
holmescn
金虫 (正式写手)
- 程序强帖: 37
- 应助: 1 (幼儿园)
- 金币: 1918.8
- 散金: 275
- 红花: 1
- 帖子: 699
- 在线: 102.6小时
- 虫号: 913482
- 注册: 2009-11-26
- 性别: GG
- 专业: 凝聚态物性 II :电子结构
13楼2011-06-27 09:30:55
★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:51:26
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:51:26
|
C++蛮力版代码: #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 for(size_t i = 1; i < 1000000; ++i) next_digit(base, base+str.length()-1, base+str.length()); return str; } int main(){ cout< } |

2楼2011-06-10 11:45:00
★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+3): 谢谢分享~~ 2011-06-10 21:51:54
小木虫(金币+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
wangww2011
木虫 (著名写手)
- 程序强帖: 13
- 应助: 11 (小学生)
- 金币: 4023.1
- 散金: 2709
- 红花: 18
- 沙发: 1
- 帖子: 1915
- 在线: 1537.1小时
- 虫号: 772953
- 注册: 2009-05-17
- 性别: GG
- 专业: 凝聚态物性 II :电子结构
★ ★ ★ ★ ★ ★
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:52:10
小木虫(金币+0.5):给个红包,谢谢回帖
微尘、梦想(金币+5): 鼓励交流~~ 2011-06-10 21:52:10
|
c语言非蛮力版 当时就乱写了个 也不清楚和上面的算法一样不一样 #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 for(j=b[i0-i-2];j } 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













回复此楼