oracle - 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。
解决方案
您可以将两个 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<>在这里摆弄
推荐阅读
- php - wp_list_pages 结果的分页
- javascript - 当我将新元素添加到顶部时,如何将位置保持在可滚动列表中?
- android - 如何添加android studio离线组件
- angular - primeNG V9 表格数据不会以角度 9 保留在屏幕上
- python - 将 CATEGORY_CHOICES 与多于一级的子选项分组?
- go - Go mod private repo 在 cloudbuild 中读取错误的路径
- python - 以新的表/数据框格式有效地将 spark 数据框列转置/分解为行 [pyspark]
- java - 退出while循环在java中不起作用
- python - 用另一个词替换一个词的每个实例,而不会破坏包含该词的其他词
- dataframe - 如何在 Pyspark 中设置 KryoSerializer?