Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pascal 大模算法_Pascal_Divide And Conquer - Fatal编程技术网

Pascal 大模算法

Pascal 大模算法,pascal,divide-and-conquer,Pascal,Divide And Conquer,我正在尝试为我的学校编程团队的在线评委制作一个Pascal程序。程序必须输出a^b mod c,其中a、b和c作为输入。您不能使用暴力作为测试用例,因为所有测试用例都有非常大的数字 经过一些研究,我发现我可以使用分而治之的策略。这是我想出的代码: function pmod(a,b,c:longint):integer; begin if b = 0 then pmod := 1; if b = 1 then pmod := a mod c;

我正在尝试为我的学校编程团队的在线评委制作一个Pascal程序。程序必须输出a^b mod c,其中a、b和c作为输入。您不能使用暴力作为测试用例,因为所有测试用例都有非常大的数字

经过一些研究,我发现我可以使用分而治之的策略。这是我想出的代码:

function pmod(a,b,c:longint):integer;
begin
     if b = 0 then
        pmod := 1;
     if b = 1 then
        pmod := a mod c;
     if b > 1 then
     begin
          if (b mod 2) = 0 then
             pmod := (pmod(a,b div 2,c) * pmod(a,b div 2,c)) mod c
          else
              pmod := (pmod(a,b-1,c) * (a mod c)) mod c;
     end;
end;

然而,在线法官给出了错误的答案。有人能指出代码有什么问题吗?

您的算法基本上是正确的,应该可以工作。你的代码中肯定有一些小地方可以改进,但我不会说它是“错的”。让我们看看一些可能的问题

  • 递归。它的优点是保持算法简单且易于阅读。然而,这是一种非常缓慢和低效的方法。由于相同的基本算法可以很容易地进行迭代,那么法官可能会在这方面给你打分

  • 更好地处理无效输入是个好主意。如果有人为“b”输入了一个负整数,则不会为pmod分配任何返回值。由于模总是返回一个正的结果,我们可以约定返回“-1”,例如,如果b 1,则返回一个错误标志 开始 如果(b mod 2)=0,则 开始 tmp:=pmod(a,b第2部分,c)*pmod(a,b第2部分,c); pmod:=tmp mod c 结束 其他的 开始 tmp:=pmod(a,b-1,c)*(a模c); pmod:=tmp mod c 结束 结束; 结束;
    function pmod(a,b: int64; c:integer):integer;
    var tmp: int64;
     begin
       if b < 0 then pmod := -1; {flag an error}
       if b = 0 then pmod := 1;
       if b = 1 then pmod := a mod c;
       if b > 1 then
        begin
          if (b mod 2) = 0 then
             begin
               tmp  :=pmod(a,b div 2,c) * pmod(a,b div 2,c);
               pmod := tmp mod c
             end
          else
             begin
               tmp  := pmod(a,b-1,c) * (a mod c);
               pmod := tmp mod c
             end
        end;
     end;