1. 程式人生 > >用MySQL的存儲過程來實現一些經典函數

用MySQL的存儲過程來實現一些經典函數

質數 刪除 sql row code while ria 實現 java

質數判斷

Java原型

boolean isPrime(int n) {
    if (n<2) {return false;}
    else if (n==2) {return true;}
    else if (n%2==0) {return false;}
    else {
        for (int i=3;i<=(int)Math.sqrt(n);i+=2) {
            if (n%i==0) {return false;}
        }
        return true;
    }
}

MySQL實現

# 判斷質數
delimiter //

create procedure isprime(n int)
begin
    declare isprime boolean default true;
    declare n_sqrt int default sqrt(n);
    declare i int default 3;
    declare p int default 2; # 因數
    if n<2 then
        set isprime = false;
    elseif n=2 then
        set isprime = true;
    elseif n%2=0 then
        set isprime = false;
    else
        t:while i<n_sqrt do
            if n%i=0 then
                set isprime = false;
                set p = i;
                leave t;
            end if;
            set i = i+2;
        end while t;
    end if;
    if isprime then
        select n,'true' as 'isPrime' from dual;
    else
        select n,'false' as 'isPrime', p from dual;
    end if;
end //

delimiter ;

call isprime(65536); # 測試1
call isprime(2333); # 測試2
drop procedure isprime; #測試完刪除存儲過程

輸出

MariaDB [mydb]> call isprime(65536);
+-------+---------+------+
| n     | isPrime | p    |
+-------+---------+------+
| 65536 | false   |    2 |
+-------+---------+------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.04 sec)

MariaDB [mydb]> call isprime(2333);
+------+---------+
| n    | isPrime |
+------+---------+
| 2333 | true    |
+------+---------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.04 sec)

未完待續

用MySQL的存儲過程來實現一些經典函數