如何检查数字总和是否可以被这个总和整除?

时间:2021-03-26 13:29:26

标签: oracle plsql

我想先计算用户指定数字的位数之和。然后我想检查这个数字是否可以被它的数字之和整除。不幸的是,例如,对于 21,它表明它不可整除,而对于 200,它表明它是可整除的。也许有人会帮助我。我只是在学习 pl SQL 语言。

DECLARE 
    
    n   number(5):=&give_number;  
    temp_sum INTEGER;  
    r        INTEGER;
    a varchar(20);
BEGIN 
    temp_sum := 0;  
  

    WHILE n <> 0 LOOP  
        r := MOD(n, 10);  
        temp_sum := temp_sum + r;  
        n := Trunc(n / 10);  
    END LOOP;   
    a:=mod(r,temp_sum);
    if a = 0   then
    dbms_output.put_line('Divisible');
    else
    dbms_output.put_line('No divisible');
    end if;
END;  

2 个答案:

答案 0 :(得分:0)

您正在检查 r 是否可以被 temp_sum 整除,如果您考虑它们所持有的值,那么 r 是最高有效数字,而 temp_sum 是数字总和。对于 21 的输入,它检查 2(最重要的数字)是否可以被 3 整除,它正确地报告它不可整除。

要修复它,您希望将输入数字保留在一个变量中,不要修改并在最终比较中使用它,而不是 r

如果我们删除一些不必要的变量并为其他变量赋予更有意义的名称:

DECLARE 
    input_value     NUMBER(5) := &give_number;
    remainder_value NUMBER(5) := input_value;
    digit_sum       INTEGER;  
BEGIN 
    digit_sum := 0;  

    WHILE remainder_value <> 0 LOOP 
        digit_sum := digit_sum + MOD(remainder_value, 10);
        remainder_value := TRUNC(remainder_value / 10);
    END LOOP;  
    dbms_output.Put_line(remainder_value);  
    dbms_output.Put_line('sum of digits = ' || digit_sum);  

    IF MOD(input_value,digit_sum) = 0   then
      dbms_output.put_line('Divisible');
    ELSE
      dbms_output.put_line('Not divisible');
    END IF;
END;
/

然后当您输入 21 时,输出为:

<块引用>
0
sum of digits = 3
Divisible

对于 202,输出为:

<块引用>
0
sum of digits = 4
Not Divisible

db<>fiddle here

答案 1 :(得分:0)

这里有一种更紧凑的方式来编写您的 PL/SQL 块,使用一些特定于该语言的功能。也许最有趣的是程序单元(子程序)的嵌套 - 例如,在 C 中,这是不允许的。我指的是在外部块的 DECLARE 部分中的“辅助函数”(数字求和函数)的声明和完整代码。

该函数还演示了递归编写函数的紧凑方法。在这种情况下,递归不会太深(只有与输入数字中的数字一样多的递归调用);一般来说,如果您可以像您一样使用循环编写相同的函数,而不是使用递归,则是首选 - 开销要少得多。另一方面,通过适当的设置(高级主题),解释器将内联递归调用——本质上是将递归函数转换为一个简单的循环。这样,您就可以两全其美:干净、紧凑的代码,以及高效的解释代码和执行。

我还展示了在屏幕上显示输出的更紧凑的方式。您只需要调用一次 put_line;让“if”(或“case 表达式”)处理要在 put_line 调用中显示的内容。此外,公共部分 'Divisible' 可以被分解出来; case 表达式只是在需要时添加 'Not '

declare

  n number := &input_number;

  function sum_of_digits(n integer) return integer is
  begin
    return mod(n, 10) + case when n < 10 then 0
                             else sum_of_digits(trunc(n/10)) end;
  end;

begin
  dbms_output.put_line(
    case when mod(n, sum_of_digits(n)) != 0 then 'Not' end || 'Divisible');
end;
/

请注意另一件事:外部块有一个名为 n 的变量,但函数(在 declare 部分)也有一个变量 n。对于嵌套块(函数定义)的持续时间,n 表示局部变量。您需要始终注意同名局部变量对外部变量的这种“屏蔽”。