找出1000以内所有的完数,即一个数等于,其不包含自身的因子之和
declare
  i number;
  j number;
  sum number;
BEGIN
  for i IN 1..1000
   loop
     sum:=0;
     for j IN 1..i-1
      loop
      if mod(i,j)=0 then sum:=sum+j;
      end if;
      end loop;
    if (i=sum)then dbms_output.putline(To_char(i));
    end if;
   end loop;
end;
希望能帮到刚开始学习的大家啦

解决方案 »

  1.   

    首先要感谢您的分享,但是本着一个共同学习,共同进步的原则,有2个问题,需要和您分享一下。
    第一个,您的代码在我的环境上,执行不了,有一些内容,需要修改,以下是修改后的内容。
    DECLARE
        i       NUMBER;
        j       NUMBER;
        n_sum   NUMBER;
    BEGIN
        i := 0;
        n_sum := 0;
        FOR i IN 1..1000 LOOP
            n_sum := 0;
            FOR j IN 1..i - 1 LOOP
                IF
                    MOD(i,j) = 0
                THEN
                    SELECT
                        n_sum + j
                    INTO
                        n_sum
                    FROM
                        dual;            END IF;
            END LOOP;        IF
                i = n_sum
            THEN
                dbms_output.put_line(i);
            END IF;
        END LOOP;END;第二,代码块,只有在数据量很大,或者业务逻辑很复杂的情况下,才会用。程序员拼的是逻辑,而不是体力。这个问题,可以通过直接查询获取,不需要些代码块循环。
    时间有点仓促,没有仔细看,应该还有优化的余地,供大家分享一下。
    以下语句,可以查询到10000以内的完数。
    WITH 
    TAB1 AS (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 10000),
    TAB2 AS (SELECT T1.L L1,T2.L L2 FROM TAB1 T1 JOIN TAB1 T2 ON MOD(T2.L,T1.L) = 0 AND T2.L > T1.L),
    TAB3 AS (SELECT L2,SUM(L1) L1 FROM TAB2 GROUP BY L2)
    SELECT L1 FROM TAB3 WHERE L2=L1 ORDER BY 1;
      

  2.   

    感谢分享
    不太建议用sum这种关键词当变量名,后面的putline应该是PUT_LINE把  这样就可以跑起来了