Algorithm 如何找到一个数字的除数并按升序打印出来?

Algorithm 如何找到一个数字的除数并按升序打印出来?,algorithm,pascal,Algorithm,Pascal,我正在尽可能快地做这件事。我搞不懂的是如何将所有除数放入数组中,然后对数组进行排序 我已经优化了for循环-它以sqrt(n)结束 我也重构了我的代码,但它仍然没有通过所有的测试 type output = array of longint; var grater,lower: output; n,i,v,counter:longint; begin read(n); setLength(grater, round(Sqrt(n))); setLe

我正在尽可能快地做这件事。我搞不懂的是如何将所有除数放入数组中,然后对数组进行排序

我已经优化了for循环-它以sqrt(n)结束

我也重构了我的代码,但它仍然没有通过所有的测试

type  output = array of longint; 
var
    grater,lower: output; 
    n,i,v,counter:longint; 
begin
    read(n);
    setLength(grater, round(Sqrt(n)));
    setLength(lower, round(Sqrt(n)));
    counter:= 0;

    for i:=1 to round(Sqrt(n)) do 
    begin

        if (n mod i = 0) then
        begin
            if i>round(Sqrt(n)) then
                grater[counter]:= i
            else 
                lower[counter]:=i;
            if n div i>round(Sqrt(n)) then
                grater[counter]:= n div i
            else 
                lower[counter]:=n div i;
            counter:= counter +1;
        end;   
    end;

    for v:=0 to Length(lower) do
    begin
       if (lower[v] <> 0) then writeln(lower[v]);
    end;
    for v:=Length(grater)-1 downto 0 do
    begin
       if grater[v] <> 0 then writeln(grater[v]);
    end;
end.
type输出=longint的数组;
变量
较低:输出;
n、 i,v,计数器:longint;
开始
读取(n);
设置长度(格栅,圆形(Sqrt(n));
设置长度(较低,圆形(Sqrt(n));
计数器:=0;
对于i:=1到四舍五入(Sqrt(n))do
开始
如果(n模i=0),则
开始
如果i>round(Sqrt(n)),那么
格栅[计数器]:=i
其他的
下[计数器]:=i;
如果n div i>round(Sqrt(n)),则
格栅[计数器]:=n第一分区
其他的
下[计数器]:=n第i部分;
计数器:=计数器+1;
结束;
结束;
对于v:=0到长度(较低)do
开始
如果(降低[v]0),则写N(降低[v]);
结束;
对于v:=长度(格栅)-1至0 do
开始
如果grater[v]0,则写入n(grater[v]);
结束;
结束。

看起来您正在做的是:

  • 检查从2到sqrt(n)的所有整数
  • 如果输入可被整数整除,则记录整数和(输入/整数)
  • 因此,对于输入12,您的输出可能如下所示:

    2
    6
    3
    4
    

    调整答案的简单方法是使用两个列表:第一个列表将按升序记录小于sqrt(输入)的因子,第二个列表将按降序记录大于sqrt(输入)的因子。然后,要按顺序打印,只需按顺序打印第一个列表的内容,然后按相反的顺序打印第二个列表的内容。

    看起来您正在做的是:

  • 检查从2到sqrt(n)的所有整数
  • 如果输入可被整数整除,则记录整数和(输入/整数)
  • 因此,对于输入12,您的输出可能如下所示:

    2
    6
    3
    4
    

    调整答案的简单方法是使用两个列表:第一个列表将按升序记录小于sqrt(输入)的因子,第二个列表将按降序记录大于sqrt(输入)的因子。然后,要按顺序打印,只需按顺序打印第一个列表的内容,然后按相反的顺序打印第二个列表的内容。

    这段代码有什么好处?有很多很多在线排序的例子;您如何在排序数组时遇到问题?既然你已经找到了按数字顺序排列的因子(半升序,半降序),你为什么要对它进行排序呢?我对Pascal很陌生,老实说,这不是我最欣赏的语言。我必须做一些家庭作业,这就是其中之一。我不想只是用排序函数粘贴一些代码,我正试着用我的方法来做,为什么不把数字除以因子,得到一棵树,直到得到一个素因子分解?对于v:=0到长度(较低)将产生一个范围错误,因为动态数组的索引是从零到长度-1。你用这段代码得到了什么?有很多很多在线排序的例子;您如何在排序数组时遇到问题?既然你已经找到了按数字顺序排列的因子(半升序,半降序),你为什么要对它进行排序呢?我对Pascal很陌生,老实说,这不是我最欣赏的语言。我必须做一些家庭作业,这就是其中之一。我不想只是用排序函数粘贴一些代码,我正试着用我的方法来做,为什么不把数字除以因子,得到一棵树,直到得到一个素因子分解?对于v:=0到长度(较低)将产生一个范围错误,因为动态数组的索引从零到长度-1。