while N !=0
LOOP
R:=MOD(N,10);
R1:=power(R,3);
A:=A+R1;
N:=TRUNC(N/10);
END LOOP;
在此之后,如果N = A那么 SYS.DBMS_OUTPUT.PUT_LINE('number is armstrong'); 其他 SYS.DBMS_OUTPUT.PUT_LINE('号码不是武器');
答案 0 :(得分:1)
你的问题是比较(N = A),因为在LOOP结束时N为零。然后,您必须将A与输入的原始数字进行比较,(NOrig = A)。 这个程序你可以帮忙:
create or replace procedure amstrong_number(pNumber int)
is
NOrig int:=0;
N int:=0;
R int:=0;
R1 int:=0;
A int:=0;
begin
NOrig:=pNumber;
N:=pNumber;
WHILE N!= 0
LOOP
R:=MOD(N,10);
R1:=POWER(R,3);
A:=A+R1;
N:=TRUNC(N/10);
END LOOP;
IF NOrig = A THEN
dbms_output.put_line(' number is amstrong ');
ELSE
dbms_output.put_line(' number is not an amstrong ');
END IF;
end;
此致
答案 1 :(得分:0)
在评论中,您说您想从键盘输入用户输入。目前尚不清楚你打算如何做到这一点;一般来说,PL / SQL没有与最终用户交互的工具,它是一种在服务器上进行处理的语言。
让用户提供号码的一种方法是使用带参数的过程。下面是一个如何做到这一点的例子。您必须首先编译该过程(例如,我将其保存在脚本中,“Armstrong.sql”,然后在SQL * Plus中运行命令“start Armstrong”)。然后用户可以使用我称之为is_Armstrong的过程,来自SQL * Plus或SQL Developer或Toad之类的图形界面,如下所示:exec is_Armstrong(...)其中括号中是用户的输入数字。
我内置了两个应用程序异常检查 - 对于负数或非整数以及太长(超过20位)的数字。我为阿姆斯特朗编写了任意长度的数字(< = 20),将其限制为三位数几乎不能保存任何工作,所以为什么不把它变成一般。还有其他可能的应用程序例外 - 例如,如果用户输入字符串而不是数字怎么办?我没有处理所有错误 - 下面的最后一个例子显示了一个未处理的错误。为你想要明确处理的任何其他内容编写自己的错误处理代码。
Armstrong.sql的内容:
create or replace procedure is_Armstrong(p_input_number number)
as
l_string varchar2(20);
l_sum number := 0;
l_loop_counter number;
l_len number;
not_a_positive_integer exception;
number_too_large exception;
begin
l_string := to_char(p_input_number);
l_len := length(l_string);
if p_input_number <= 0 or p_input_number != floor(p_input_number) then
raise not_a_positive_integer;
elsif l_len > 20 then
raise number_too_large;
end if;
for l_loop_counter in 1..l_len
loop
l_sum := l_sum + power(to_number(substr(l_string, l_loop_counter, 1)), l_len);
end loop;
if p_input_number = l_sum then
dbms_output.put_line('Number ' || l_string || ' is an Armstrong number.');
else
dbms_output.put_line('Number ' || l_string || ' is not an Armstrong number.');
end if;
exception
when not_a_positive_integer then
dbms_output.put_line('Input number must be a positive integer.');
when number_too_large then
dbms_output.put_line('Input number must be no more than twenty digits.');
end;
/
编写程序:
SQL> start Armstrong.sql
Procedure created.
Elapsed: 00:00:00.03
用法示例:
SQL> exec is_Armstrong(-33);
Input number must be a positive integer
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.08
SQL> exec is_Armstrong(1.5);
Input number must be a positive integer
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.08
SQL> exec is_Armstrong(1234512345123451234512345);
Input number must be no more than twenty digits
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.01
SQL> exec is_Armstrong(3);
Number 3 is an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
SQL> exec is_Armstrong(100);
Number 100 is not an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
SQL> exec is_Armstrong(371);
Number 371 is an Armstrong number.
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.00
SQL> exec is_Armstrong('abc')
BEGIN is_Armstrong('abc'); END;
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1
Elapsed: 00:00:00.00