我想先计算用户指定数字的位数之和。然后我想检查这个数字是否可以被它的数字之和整除。不幸的是,例如,对于 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;
答案 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
表示局部变量。您需要始终注意同名局部变量对外部变量的这种“屏蔽”。