稳定的数字

大数乘积逆运算算法

Description

  定义一种操作,经过该操作,可以得到一个数中所有数字的乘积(原数至少要是个两位数)。比如679经过一次操作可以得到378。  你的任务读入一个数,计算经过一次操作得到它的最小的数是多少。

Input

  仅一行,表示一个十进制数。数的长度可能到达1000位。

Output

  经过一次操作可以得到这个数的最小的数。如果没有这样的数,输出“There is no such number.”(不包括引号)

Sample Input

输入1:

0

输入2:

18

输入3:

51

Sample Output

输出1:

10

输出2:

29

输出3:

There is no such number.

思路:因为每个数≤9,所以从9往2DIV就OK了

pascal:

type arr=array[0..1000] of longint;
var //zs:array[1..9] of longint=(2);
bz:array[0..1000] of boolean;
a,t:arr;//ay[0..1000] of longint;
m,i,j,l,tot,w:longint;
n:ansistring;
p:boolean;
function modd(x:arr; y:longint):longint;
var i,j:longint;
z:arr;
begin
    modd:=0;
    z:=x;
    for i:=z[0] downto 2 do
    begin
        z[i-1]:=z[i-1]+z[i] mod y *10;
        z[i]:=z[i] div y;
    end;
    modd:=z[1] mod y;
end;
function divv(x:arr; y:longint):arr;
var i,j:longint;
begin
    fillchar(divv,sizeof(divv),0);
    divv:=x;
    for i:=divv[0] downto 2 do
    begin
        divv[i-1]:=divv[i-1]+divv[i] mod y *10;
        divv[i]:=divv[i] div y;
    end;
    divv[1]:=divv[1] div y;
    while divv[divv[0]]=0 do
    begin
        dec(divv[0]);
    end;
end;
begin
    readln(n);
    if n='0' then writeln(10)
    else
    if n='1' then writeln(11)
    else
    if n='2' then writeln(12)
    else
    begin
    //run();
    t[0]:=length(n);
    for i:=1 to length(n) do t[i]:=ord(n[t[0]-i+1])-48;
    //t:=n;
    for i:=9 downto 2 do
    begin
        if (t[0]=1)and(t[1]=1) then break;
        if modd(t,i)=0 then
        begin
            while modd(t,i)=0 do
            begin
                inc(a[0]);
                a[a[0]]:=i;
                t:=divv(t,i);
            end;
        end;
    end;
    if (a[0]=0)or(t[0]<>1) then
    begin
        writeln('There is no such number.');
        halt;
    end;
        {m:=a[0];
        w:=2;
        for i:=3 to m do
        begin
            if a[i-w]=2 then
            begin
                if a[i-w]*a[i-w-1]<10 then
                begin
                    a[i-w-1]:=a[i-w-1]*a[i-w];
                    dec(a[0]);
                    for j:=i-w to m do
                    a[j]:=a[j+1];
                    inc(w);
                end;
            end;
        end;
        m:=a[0];
        for i:=m-1 downto 1 do
        begin
            if a[i]*a[i+1]<10 then
            begin
                a[i]:=a[i]*a[i+1];
                for j:=i+1 to m do a[j]:=a[j+1];
                dec(a[0]);
            end;
        end;}
        for i:=1 to a[0] do
        begin
            for j:=i+1 to a[0] do
            begin
                if a[i]>a[j] then
                begin
                    tot:=a[i];
                    a[i]:=a[j];
                    a[j]:=tot;
                end;
            end;
        end;
        if a[0]=1 then write(1);
        for i:=1 to a[0] do write(a[i]);
    end;
end.

ps:拒绝KO表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值