更新时间:2015-11-16 09:52:09浏览次数:1+次
/*
- 不知道银行卡总金额时从银行卡转钱到支付宝余额宝需要最少次数的算法
*/
#include <iostream>
using namespace std;
double BankOut(double);// - 支付宝转钱调用银行的API,输入金额,返回剩余的钱数。内部函数,我们无法查看返回值
void GetMoney();
double dCardLeft = 4980.88;// - 真实总额,但是我们不知道
int iTakeCount = 0;// - 转账次数
double dWeCalulate = 0;// - 我们自己计算的
void main()
{
// - 一般屌丝一个月工资也不足1W,但是至少也有哦2K。
// - 假设发了工资,然后从银行卡转钱到余额宝,这样一个月多少有点利息
// - 问题:哪样转钱可以让转账的次数最少
// - 换种问法:以最少的次数确定银行卡的钱数
// - 用2000来循环转账到余额宝,直到不够2000再实施下一步操作
GetMoney();// - 折半取钱
cout << "总金额:" << dWeCalulate << endl;
cout << "转账次数:" << iTakeCount << endl;
}
double BankOut(double dTake)
{
// - 转钱API函数,银行的取钱函数
if (dTake > dCardLeft)
{
// - 金额不足
cout << "金额不足\n";
return -1;// - 错误码:金额不足
}
if (dTake < 0.01)
return -2;// - 错误码:取钱的金额太小,最小单位为0.01元
dCardLeft = dCardLeft - dTake;
cout << "取款:" << dTake << endl;
return dCardLeft;// - 返回剩余的钱
}
void GetMoney()
{
// - 一次取2000,直到剩余的钱不够2000
while (BankOut(2000) >= 2000)
{
dWeCalulate += 2000;
iTakeCount++;
}
// - 最后取的一次,因为剩余金额不足,所以没有统计到
dWeCalulate += 2000;
iTakeCount++;
// - 剩余不够2000的钱,使用折半法
double iLeftHalf = dCardLeft / 2;
while (iLeftHalf >= 0.01)
{
if (BankOut(iLeftHalf) == -1)
{
//钱不够一半
iLeftHalf = iLeftHalf / 2;
}
else
{
// - 可以取钱
dWeCalulate += iLeftHalf;
iLeftHalf = dCardLeft / 2;
}
iTakeCount++;
}
if (dCardLeft < 0.02)
{
BankOut(0.01);
iTakeCount++;
dWeCalulate += 0.01;
return;// - 取完了
}
}
相关资讯