当前位置:C++技术网 > 精选软件 > 不知道银行卡金额时怎样以最少的次数将银行卡所有钱转账到余额宝

不知道银行卡金额时怎样以最少的次数将银行卡所有钱转账到余额宝

更新时间:2015-11-16 09:52:09浏览次数:1+次

    这个方法就是平时经常使用转账,然后发现次数特别多,才想要写个算法看看。
    现在习惯将银行卡的钱转到余额宝来管理,这样对于自己有多少钱清清楚楚。放在银行里就像一个黑盒子一样,要短信通知,还要收钱。网银也不方便,支付宝这个确实很方便,放在余额宝里面,还有不错的活期利息。
    但是每次工资到账后,就马上将银行卡钱转到余额宝,因为工资会扣掉一些钱,实际多少并不清楚,所以需要猜测,就出现了这个问题。怎么转钱可以达到次数最少。
    用于人实际操作的方法就是:从一个基数开始,先将整K的一次取出来,然后,猜测一个大概的数字,取钱。如果不够,将这个数字折半,然后取。不管是够不够,取一次就折半一次。人工操作当然不要求严格的折半,只要是差不多一半就行了。
    用程序来模拟的方法就严格折半。用4980.88的总金额来取,效果如下:
    支付宝转钱算法,不知道银行卡金额时怎样以最少的次数将银行卡所有钱转账到余额宝
    一般不管多少钱,都是18-19次的样子。而算法的代码,就是下面这样子:
/*
- 不知道银行卡总金额时从银行卡转钱到支付宝余额宝需要最少次数的算法
*/
#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;// - 取完了
    }
}

    你只需要建立一个空的Win32控制台程序项目,然后添加一个cpp文件,贴上这个代码,就可以运行得到结果了。

代码说明:

函数
1.BankOut
    此函数是银行用于转钱的函数,支付宝会调用。这个函数相当于转账的API函数了。输入一个金额转钱,然后返回剩余的钱数。
2.GetMoney
    函数就是执行取整和折半算法的函数,这个函数可以完成取钱的动作。这个是什么自己的转账函数,内部封装了转账API函数,并加入了我们自己的算法。

变量
1.dCardLeft
    这个变量存储的是银行卡实际的金额。对我们来说是未知的,只有银行自己知道。我们为了演示,需要设定这个值,不然算法无法执行。一开始还打算写一个模型,但是想想还是写成可以执行的代码。
2.iTakeCount
    这个变量是取钱的次数,每一次取钱都会累加一次。BankOut是API函数,我们无法改动,不要在里面添加其他的代码了。尽管在BankOut里添加代码来统计次数和实际转到的钱数,但是会让算法的可移植性太差,也不符合实际的需要。
3.dWeCalulate
    通过转账后,我们将转到的钱累计,来计算银行卡里实际的总金额。这个值的统计也只能放在GetMoney里,不能放在BankOut里,理由和iTakeCount变量一样。

    这个对于小数点的处理没有做好,就留给你来处理啦。要精确到0.01,而且要保证最后得到的金额和实际金额一致。我就抛砖引玉了。请你来改进吧。