Matlab 编程 Project Euler Problem 20 Factorial digit sum

来源:互联网 发布:cf数据异常23 0 编辑:程序博客网 时间:2024/05/29 10:44
%Factorial digit sum_20.m
%求100!结果的所有位值的总和
%方法:通过数组的方式,将结果的每一位分别放置在数组中。
%其中数组是倒序排列的,即第一位是个位,第二位是十位,......


clear all;
close all;
sum_digit=zeros(1,200);  %设置 1 X 200 的数组
sum_digit(1)=1;  %首位数字为1
for i=1:100-1  %由于乘以100的结果不改变求和总值,所以乘到99
    i_ge=rem(i,10);  %乘数的个位
    i_shi=floor(i/10);  %乘数的十位
    if(i_shi==0)  %若十位为0
        sum_digit=sum_digit.*i;  %矩阵的点乘
        %若数组中存在大于9的数,则进位
        for j=1:length(sum_digit)  
            if(sum_digit(j)>9)
                %sum_digit(j+2)=sum_digit(j+2)+floor(sum_digit(j)/100);
                sum_digit(j+1)= sum_digit(j+1)+rem(floor(sum_digit(j)/10),10);
                sum_digit(j)=rem(sum_digit(j),10);
            end
        end
    %若i_shi>0
    else
        sum_digit_ge=sum_digit.*i_ge;  % i 的个位
        %若数组中存在大于9的数,则进位
        for j=1:length(sum_digit_ge)
            if(sum_digit_ge(j)>9)
                %sum_digit_ge(j+2)=sum_digit_ge(j+2)+floor(sum_digit_ge(j)/100);
                sum_digit_ge(j+1)= sum_digit_ge(j+1)+rem(floor(sum_digit_ge(j)/10),10);
                sum_digit_ge(j)=rem(sum_digit_ge(j),10);
            end
        end
        sum_digit_shi=sum_digit.*i_shi;  % i 的十位
        %若数组中存在大于9的数,则进位
        for j=1:length(sum_digit_shi)
            if(sum_digit_shi(j)>9)
                %sum_digit_shi(j+2)=sum_digit_shi(j+2)+floor(sum_digit_shi(j)/100);
                sum_digit_shi(j+1)= sum_digit_shi(j+1)+rem(floor(sum_digit_shi(j)/10),10);
                sum_digit_shi(j)=rem(sum_digit_shi(j),10);
            end
        end
        %将 i 个位和十位分别与sum_digit相乘后的值按位相加
        sum_digit(1)=sum_digit_ge(1);
        for k=2:length(sum_digit)-1
            sum_digit(k)=sum_digit_shi(k-1)+sum_digit_ge(k);
        end
        %若数组中存在大于9的数,则进位
        for j=1:length(sum_digit)
            if(sum_digit(j)>9)
                %sum_digit(j+2)=sum_digit(j+2)+floor(sum_digit(j)/100);
                sum_digit(j+1)= sum_digit(j+1)+rem(floor(sum_digit(j)/10),10);
                sum_digit(j)=rem(sum_digit(j),10);
            end
        end
    end
end
sum_num=sum(sum_digit);  %求和
disp(sum_num)  %显示
disp(sum_digit(1:200))%显示前200位的值