在霍格沃茨找零钱(20)

时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱。
输入描述:
输入在1行中分别给出P和A,格式为“Galleon.Sickle.Knut”,其间用1个空格分隔。这里Galleon是[0, 107]]区间内的整数,Sickle是[0, 17)区间内的整数,Knut是[0, 29)区间内的整数。
输出描述:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
输入例子:
10.16.27 14.1.28
输出例子:
3.2.1

解题思路:本题可以类比为两个形如hh:mm:ss格式的时间点,求解它们的时间差值并且以hh:mm:ss格式显示出来。注意题目上说了如果是负数,要显示负号,所以只将负号显示在行首就可以了。在用c++解决这道题的难点是写一个类似split()功能的函数。以下是我的代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
//字符串分割函数
vector<string> split(const string &src, string seperate_character)
{
    vector<string> result;
    int seperate_characterLen = seperate_character.length();
    int lastPositon = 0, index = -1;
    while(-1 != (index = src.find(seperate_character, lastPositon)) )
    {
        result.push_back(src.substr(lastPositon, index - lastPositon));
        lastPositon = index + seperate_characterLen;
    }
    string lastString = src.substr(lastPositon);
    if(!lastString.empty())
        result.push_back(lastString);
    return result;
}

//将字符串转换为整型函数
int myStoi(string str)
{
    int result = 0;
    char *p = &str[0];
    while(*p != '\0')
    {
        if(*p >= '0' && *p <= '9')
        {
            result = result * 10 + *p - '0';
        }
        p++;
    }
    return result;
}

int main(int argc, char **argv)
{
    string stra, strb;
    int suma = 0, sumb = 0;
    cin >> stra >> strb;
    string del = ".";
    vector<string> veca = split(stra, del);
    vector<string> vecb = split(strb, del);
    suma = (myStoi(veca[0]) * 17 + myStoi(veca[1])) * 29 + myStoi(veca[2]);
    sumb = (myStoi(vecb[0]) * 17 + myStoi(vecb[1])) * 29 + myStoi(vecb[2]);
    int result = sumb - suma;
    int Galleon = result / (17*29);
    result %= (17*29);
    int Sickle = result / 29;
    int Knut = result % 29;
    cout << Galleon << ".";
    if(Galleon < 0)
    {
        Sickle *= -1;
        Knut *= -1;
    } 
    cout << Sickle << "." << Knut << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lbb17745169396/article/details/80196707