c题解 1037 在霍格沃茨找零钱 (20 分)


原题

https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232

c代码

思路:类比现实中找零钱,按三个进制所在的位数相减,小了就向高位借1。值得注意的是后面的两位是P-A还是A-P,根据第一个Galleon位的大小的比较来决定。

#include 
using namespace std;

int P[3] = {0},A[3] = {0},change[3] = {0};

int main()
{
    scanf("%d.%d.%d %d.%d.%d", &P[0], &P[1], &P[2], &A[0], &A[1], &A[2]);
    
    change[0] = A[0] - P[0];  
    int flag=-1;
    for (int i = 2; i >0; i--)
    {
        if( change[0] <0) {//如果应付的价钱小于他实付的钱——反过来减
            change[i] = change[i]+(P[i] - A[i]);//注意要加上change[i]
            flag=1;
        }
        else change[i] =change[i]+(A[i] - P[i]);//注意要加上change[i]

        if (change[i] < 0)
        {
            if (i == 1)
            {           
                change[i - 1]=change[i - 1]+flag*1;//反过来减,对第三位是加1
                change[i] += 17;
            }
            if (i == 2)
            {
                change[i - 1]--;
                change[i] += 29;
            }
        }
    }
    cout<< change[0] << "." << change[1] << "." << change[2];
    return 0;
}

最开始的想法——全部换算成一个计量单位相减后,再整除取余换算回去。担心数字过大越界,然后运算量大费时。没想到都没有,嘿!

#include 
using namespace std;

int main()
{
    long P, A;

    int Galleon1, Sickle1, Knut1, Galleon2, Sickle2, Knut2;
    scanf("%d.%d.%d", &Galleon1, &Sickle1, &Knut1);
    P = Galleon1 * 29 * 17 + Sickle1 * 29 + Knut1;
    scanf("%d.%d.%d", &Galleon2, &Sickle2, &Knut2);
    A = Galleon2 * 29 * 17 + Sickle2 * 29 + Knut2;

    long change = A - P;
    if (change < 0)
    {
        cout << "-";
        change = -change;
    }
    int Galleon, Sickle, Knut;
    Galleon = change / 29 / 17;
    Sickle = (change % (29 * 17)) / 29;
    Knut = change - Galleon * 29 * 17 - Sickle * 29;

    cout << Galleon << "." << Sickle << "." << Knut;
    return 0;
}

参照别人博客再简化https://blog.csdn.net/shiliang97/article/details/99936776
//甭管什么数,满多少进1的——只有 取余进位的 和 余数

#include
using namespace std;
int main(){
	int a,b,c,d,e,f;
	scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&d,&e,&f);
	int count=d*17*29+e*29+f-a*17*29-b*29-c;
	if(count<0){
		cout<<"-";
		count=-count;
	} 
	cout<