首页 > 解决方案 > pl sql中的硬币找零问题。在plsql中转换c++逻辑

问题描述

如何在 plsql 中转换此逻辑。使用甲骨文。我已经在 c++ 中完成了这段代码,但是在 plsql 中执行此代码时遇到了问题。

#include <iostream>
#include <vector>
using namespace std;
void coinChange(vector<int>& v, vector<int>& v1, int& a) {
        int p;
        for(int i = 0; i < v.size(); i++) {
            if(a % v[i] != 0 && a >= v[i]) {
                p = a / v[i];
                if(p > v1[i]) {
                    a = a - (v[i] * v1[i]);
                    p = v1[i];
                    v[i] = p;
                } else {
                    a = a % v[i];
                    v[i] = p;
                }
            } else if( a % v[i] == 0 && a >= v[i]) {
                p = a / v[i];
                if(p > v[i]) {
                    a = a - (v[i] * v1[i]);
                    p = v1[i];
                    v[i] = p;
                } else {
                    a = 0;
                    v[i] = p;
                }
            } else if(a < v[i] || a == 0) {
                v[i] = 0;
            }
            cout<<v[i]<<"&&&&&"<<endl;
        }

    }
int main()
{
    vector<int> v;
    vector<int> v1;
    int a;
    cout<<"enter amount";
    cin>>a;
    int m;
    cout<<"enter no. of coins";
    cin>>m;
    cout<<"enter coins";
    int n;
    for(int i = 0 ; i < m; i++) {
        cin>>n;
        v.push_back(n);
    }
    cout<<"enter no. of each coin";
    int o;
    for(int i = 0 ; i < m; i++) {
        cin>>o;
        v1.push_back(o);
    }
    coinChange(v,v1,a);
    return 0;
}

这是硬币找零的问题,我想要的输出是如何用给定的 10,5 和 1 硬币返回找零。这段代码是解决方案,但只想将其转换为 plsql。

标签: oracleplsql

解决方案


您可以将两个 SQL 集合传递到一个过程中;但是,如果您创建一个包含硬币值和数量的对象类型,它会容易得多。

如果您的变量具有有意义的名称,也更容易理解代码。

甲骨文设置

CREATE TYPE coin_amount IS OBJECT(
  value  NUMBER(6,2),
  amount NUMBER(5,0)
);
/

CREATE TYPE coin_amount_list IS TABLE OF coin_amount;
/

PL/SQL

CREATE PROCEDURE coinChange(
  i_coin_amounts IN coin_amount_list,
  i_change       IN NUMBER
)
IS
  p_sorted_coin_amounts coin_amount_list;
  coin                  NUMBER(6,2);
  amount                NUMBER(5,0);
  remaining_change      NUMBER(6,2) := i_change;
BEGIN
  SELECT   coin_amount( value, SUM( amount ) )
  BULK COLLECT INTO p_sorted_coin_amounts
  FROM     TABLE( i_coin_amounts )
  WHERE    value  > 0
  AND      amount > 0
  GROUP BY value
  ORDER BY value DESC;

  DBMS_OUTPUT.PUT_LINE( 'Change for:  ' || TO_CHAR( remaining_change, 'L9990D00' ) );
  DBMS_OUTPUT.PUT_LINE( '-------------------------------' );

  FOR i IN 1 .. p_sorted_coin_amounts.COUNT LOOP
    coin   := p_sorted_coin_amounts(i).value;
    amount := LEAST( FLOOR( remaining_change / coin ), p_sorted_coin_amounts(i).amount );
    IF amount > 0 THEN
      DBMS_OUTPUT.PUT_LINE( '    ' || TO_CHAR( amount, '99990' ) || ' x ' || TO_CHAR( coin, 'L9990D00' ) );
      remaining_change := remaining_change - coin * amount;
    END IF;
  END LOOP;
  DBMS_OUTPUT.PUT_LINE( '-------------------------------' );
  DBMS_OUTPUT.PUT_LINE( 'Outstanding: ' || TO_CHAR( remaining_change, 'L9990D00' ) );
  DBMS_OUTPUT.PUT_LINE( '-------------------------------' );
END;
/

测试

BEGIN
  coinChange(
    coin_amount_list(
      coin_amount( 0.05, 50 ),
      coin_amount( 0.10, 15 ),
      coin_amount( 0.01,  5 )
    ),
    2.57
  );
END;
/

输出:

Change for:               $2.57
-------------------------------
        15 x              $0.10
        21 x              $0.05
         2 x              $0.01
-------------------------------
Outstanding:              $0.00
-------------------------------

BEGIN
  coinChange(
    coin_amount_list(
      coin_amount( 0.20, 4 ),
      coin_amount( 1.00, 5 ),
      coin_amount( 0.20, 4 ),
      coin_amount( 0.02, 1 )
    ),
    6.33
  );
END;
/

输出:

Change for:               $6.33
-------------------------------
         5 x              $1.00
         6 x              $0.20
         1 x              $0.02
-------------------------------
Outstanding:              $0.11
-------------------------------

db<>在这里摆弄


推荐阅读