Matlab编程 Project Euler Problem24 : Lexicographic permutations

来源:互联网 发布:算法和程序的关系 编辑:程序博客网 时间:2024/06/08 02:08
%Lexicographic_permutations_24.M
%找出0~9排序 从小到大排序中的第1000000个数据
%思路:排列第一个数有A(9,9)种方法,拍第二个数有A(8,8)种方法,以此类推,只要不大于1000000,就可以减去这些值
clear all;
close all;


set=0 : 9 ;  %集合0~9
result_vec=zeros(1,10);  %已经拍好的数
temp=zeros(1,10);  
rest_num=1000000;  %还剩多少个数字
arrange_val=1;  %剩余数字的组合数
N=10-1;


for k=1:10-1  %排出前面9个数,第十个也就出来了
    %计算A(N,N)
    for i=1 : N
        arrange_val=arrange_val * i ;
    end
    N=N-1;
    
    num=int8(floor(rest_num/arrange_val));  %将double转化为int8,作为矩阵的下标
    %对于能整除arrange_val的rest_num,其对应的num正好是set(num)所有排列中的最后一个,由于下面语句中使用num+1作为下标,就会出现错误,于是减一
    if(rem(rest_num,arrange_val)==0)  
        num=num-1;
    end
    result_vec(k)=set(num+1);  %由于set(num)=num+1 所以加一 
    rest_num=rest_num-double(num)*arrange_val;  %更新剩余数据
    %将set(num+1)后的数据前移一位,set(num+1)放在set数组的最后一位,这样只需要看前面未选的数字即可
    temp(1)=set(num+1);
    for j=num+1 : 10-1
        set(j)=set(j+1);
    end
    set(10)=temp(1);
    %更新arrange_val的值
    arrange_val=1;
end
result_vec(10)=set(1);  %将最后一个未选的数字放在结果数组result_vec的最后一位
disp(result_vec)  %显示输出

原创粉丝点击