pl / sql从表中找到最大公因子

时间:2016-03-08 07:05:26

标签: plsql plsqldeveloper

我试图找到一些数字的最大公因子,我已经放入表中。到目前为止,我有一个函数,假设计算gcf

CREATE FUNCTION gcd (x INTEGER, y INTEGER) RETURN INTEGER AS
   ans INTEGER;
BEGIN
   IF (y <= x) AND (x MOD y = 0) THEN
      ans := y;
   ELSIF x < y THEN 
      ans := gcd(y, x);
   ELSE
      ans := gcd(y, x MOD y);
   END IF;
   RETURN ans;
END;

在这里我创建并随机填充我的表

DROP TABLE numere
/
CREATE TABLE numbers (number NUMBER(3) NOT NULL)
/
set serveroutput on
DECLARE
number NUMBER(3);
cursor c1 is
   SELECT * FROM note;
BEGIN
   FOR i IN 1 .. 10 LOOP
      number:=dbms_random.value(20,100);
      insert into numbers values(number);
   end loop;
   commit;
END;
/

如何将gcf集成到我的代码中?我想显示数字,然后是他们的gcf。

1 个答案:

答案 0 :(得分:1)

我不确定你的gcd功能。在我看来不工作。网上有很多。这是其中之一:

CREATE OR REPLACE FUNCTION find_gcd (
      p_n1    IN  POSITIVE
  ,   p_n2    IN  POSITIVE
  )
  RETURN POSITIVE
  IS
      l_n1    POSITIVE := p_n1;
      l_n2    POSITIVE := p_n2;
  BEGIN
      WHILE NOT (l_n1 = l_n2)
      LOOP
          CASE SIGN(l_n1 - l_n2)
          WHEN +1
          THEN l_n1 := l_n1 - l_n2;
          ELSE l_n2 := l_n2 - l_n1;
          END CASE;
      END LOOP;
      RETURN (l_n1);
  END find_gcd;
  /

你可以简单地修改你的PL / SQL块来调用gcd函数并打印出结果(我在这里假设你想要找到每个数字的gcd和你表中的以下数字,所以我使用了{{3}功能):

DECLARE
lv_number NUMBER(3);
lv_gcd INTEGER;
BEGIN
   FOR i IN 1 .. 10 LOOP
      lv_number:=dbms_random.value(20,100);
      insert into numbers values(lv_number);
   end loop;
   commit;

   FOR i in (select COL_VAL, lead(COL_VAL) over (order by rowid) nxt_val from numbers)
   LOOP
   lv_gcd := find_gcd(i.COL_VAL, i.nxt_val);
   DBMS_OUTPUT.PUT_LINE('GCD for '||TO_CHAR(i.COL_VAL)||' and '|| TO_CHAR(i.nxt_val) ||' is '||TO_CHAR(lv_gcd));
   END LOOP;

END;

/