1037 在霍格沃茨找零钱 (20 分)
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱 P 和他实付的钱 A,你的任务是写一个程序来计算他应该被找的零钱。
输入格式:
输入在 1 行中分别给出 P 和 A,格式为 Galleon.Sickle.Knut
,其间用 1 个空格分隔。这里 Galleon
是 [0, 107] 区间内的整数,Sickle
是 [0, 17) 区间内的整数,Knut
是 [0, 29) 区间内的整数。
输出格式:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
一、C实现
#include<stdio.h>
int main()
{
int needToPay[3],paid[3];
int sumNeed,sumPaid;
int sign=1;
int left;
int Galleon,Sickle,Knut;
scanf("%d.%d.%d",&needToPay[0],&needToPay[1],&needToPay[2]);
scanf("%d.%d.%d",&paid[0],&paid[1],&paid[2]);
sumNeed = (needToPay[0]*17+needToPay[1])*29+needToPay[2];
sumPaid = (paid[0]*17+paid[1])*29+paid[2];
if(sumNeed>sumPaid) {
sign=-1;
printf("-");
}
left = (sumPaid-sumNeed)*sign;
Knut = left%29;
left/=29;
Sickle = left%17;
Galleon = left/17;
printf("%d.%d.%d",Galleon,Sickle,Knut);
return 0;
}
二、Java实现
import java.util.Scanner;
public class Main {
final static int GalleonTrans = 17*29;
final static int SickleTrans = 29;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String needPayInitial = scanner.next();
String paidInitial = scanner.next();
String[] needPay = needPayInitial.split("\\.");
String[] paid = paidInitial.split("\\.");
int sumNeed = Integer.parseInt(needPay[0])*GalleonTrans+
Integer.parseInt(needPay[1])*SickleTrans+Integer.parseInt(needPay[2]);
int sumPaid = Integer.parseInt(paid[0])*GalleonTrans+
Integer.parseInt(paid[1])*SickleTrans+Integer.parseInt(paid[2]);
int sign=1;
if(sumNeed>sumPaid) {
sign=-1;
System.out.print("-");
}
int left = (sumPaid-sumNeed)*sign;
int Knut = left%29;
left/=29;
int Sickle = left%17;
int Galleon = left/17;
System.out.println(Galleon+"."+Sickle+'.'+Knut);
}
}
这里要注意:
调用split方法时,如果分隔符为'.'或者'|'需要写作'\\.'和'\\|'才可以,因为他们是转义字符,+*号同理