首页 > 试题广场 >

在霍格沃茨找零钱(20)

[编程题]在霍格沃茨找零钱(20)
  • 热度指数:11001 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易。”现在,给定哈利应付的价钱P和他实付的钱A,你的任务是写一个程序来计算他应该被找的零钱。

输入描述:
输入在1行中分别给出P和A,格式为“Galleon.Sickle.Knut”,其间用1个空格分隔。这里Galleon是[0, 107]]区间内的整数,Sickle是[0, 
17)区间内的整数,Knut是[0, 29)区间内的整数。


输出描述:
在一行中用与输入同样的格式输出哈利应该被找的零钱。如果他没带够钱,那么输出的应该是负数。
示例1

输入

10.16.27 14.1.28

输出

3.2.1
import java.util.Scanner;
public class Main {
	private static final int[] W = {17*29,29,1};
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		String[] p = in.next().split("\\.");
		String[] a = in.next().split("\\.");
		int[] P = {Integer.parseInt(p[0]),Integer.parseInt(p[1]),Integer.parseInt(p[2])};
		int[] A = {Integer.parseInt(a[0]),Integer.parseInt(a[1]),Integer.parseInt(a[2])};
		int ta = A[0]*W[0]+A[1]*W[1]+A[2]*W[2];
		int tp = P[0]*W[0]+P[1]*W[1]+P[2]*W[2];
		int t = ta-tp;
		if(ta<tp){
			System.out.print("-");
			t = -t;
		}
		System.out.println(t/W[0]+"."+t%W[0]/W[1]+"."+t%W[0]%W[1]/W[2]);
	}
}

编辑于 2016-06-12 12:34:13 回复(12)
#include<stdio.h>
int main (){//the shorter,the better.
    int Pg,Ps,Pk,Ag,As,Ak;
    for(;~scanf("%d.%d.%d %d.%d.%d",&Pg,&Ps,&Pk,&Ag,&As,&Ak);Ak = Ag*493+As*29+Ak-Pg*493-Ps*29-Pk,As=Ak>=0?1:(Ak=-Ak,-1),printf("%d.%d.%d\n",As*Ak/493,Ak%493/29,Ak%493%29));
}

发表于 2018-01-30 14:28:53 回复(4)
L0L头像 L0L
#include<iostream>
#include<string>
using namespace std;
int main(){
	string s1,s2;
	cin>>s1>>s2;
	int pos1,pos2,a1,a2,a3,b1,b2,b3;
	int sum1,sum2,result,c1,c2,c3;
	pos1=s1.find('.');
	a1=stoi(s1.substr(0,pos1));
	pos2=s1.find('.',pos1+1);
	a2=stoi(s1.substr(pos1+1,pos2));
	a3=stoi(s1.substr(pos2+1));

	pos1=s2.find('.');
	b1=stoi(s2.substr(0,pos1));
	pos2=s2.find('.',pos1+1);
	b2=stoi(s2.substr(pos1+1,pos2));
	b3=stoi(s2.substr(pos2+1));

	sum1=a1*17*29+a2*29+a3;
	sum2=b1*17*29+b2*29+b3;
	result=sum2-sum1;
	c1=result/17/29;
	c2=result/29%17;;
	c3=result%29;
	if(c2<0)	c2*=-1;
	if(c3<0)	c3*=-1;
	cout<<c1<<"."<<c2<<"."<<c3<<endl;
	return 0;
}


发表于 2015-11-18 09:47:33 回复(1)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        int priceTotal,paidTotal;
        Scanner sc=new Scanner(System.in);
        String temp1=sc.next();
        String temp2=sc.next();
        String[] realPrice=temp1.split("\\.");
        int Galleon=Integer.parseInt(realPrice[0]);
        int Sickle=Integer.parseInt(realPrice[1]);
        int Knut=Integer.parseInt(realPrice[2]);
        priceTotal=17*29*Galleon+29*Sickle+Knut;
        String[] realPaid=temp2.split("\\.");
        Galleon=Integer.parseInt(realPaid[0]);
        Sickle=Integer.parseInt(realPaid[1]);
        Knut=Integer.parseInt(realPaid[2]);
        paidTotal=17*29*Galleon+29*Sickle+Knut;
        int charge=paidTotal-priceTotal;
        Galleon=charge/(17*29);
        Sickle=(charge%(17*29))/29;
        Knut=(charge%(17*29))%29;
        if(paidTotal<priceTotal){
            System.out.print("-");
            System.out.print(-Galleon+"."+-Sickle+"."+-Knut);
        }else{
            System.out.println(Galleon+"."+Sickle+"."+Knut);
        }
    }
}
发表于 2022-05-15 14:55:59 回复(0)
#include<iostream>
#include<string>
using namespace std;

int main(){
    string str_bill, str_pay;
    int gal_bill, sic_bill, kun_bill;
    int gal_pay, sic_pay, kun_pay;
    int sum_bill, sum_pay, sum_deal;
    
    cin>>str_bill >> str_pay;
    sscanf(str_bill.c_str(), "%d.%d.%d", &gal_bill, &sic_bill, &kun_bill);
    sscanf(str_pay.c_str(), "%d.%d.%d", &gal_pay, &sic_pay, &kun_pay);
    
    sum_bill = gal_bill * 17 * 29 + sic_bill * 29 + kun_bill;
    sum_pay = gal_pay * 17 * 29 + sic_pay * 29 + kun_pay;
    sum_deal = abs(sum_bill - sum_pay);
    
    cout<<(sum_bill >= sum_pay ? "-":"")<<sum_deal/(29*17)<<"."\
    <<sum_deal/29%17<<"."<<sum_deal%(29);
    return 0;
}
发表于 2020-10-31 16:40:35 回复(0)
贪心法没法通过,存在超时情况。我怀疑测试用例里有错误的用例。比如有17和29这样的非法数字
我自测极端情况都是1s内出结果的。(PAT也通过了)
#include<iostream>
using namespace std;

int main() {
	string t1,t2;
	long long g1,s1,k1,g2,s2,k2;
	bool neg=false;
	scanf("%lld.%lld.%lld %lld.%lld.%lld",&g1,&s1,&k1,&g2,&s2,&k2);
	if(g1>g2||(g1==g2&&s1>s2)||(g1==g2&&s1==s2&&k1>k2)){
		swap(g1,g2);
		swap(s1,s2);
		swap(k1,k2);
		neg=true;
	}
	long long cnt=0;
	while(g1<g2||s1<s2||k1<k2) {
		if(g1<g2-1){
			g1++;
			cnt+=17*29;
			continue;
		}
		if(g1!=g2){
			s1++;
			cnt+=29;
			if(s1==17){
				s1=0;
				g1++;
			}
			continue;
		}
		k1++;
		cnt+=1;
		if(k1==29){
			k1=0;
			s1++;
		}
	}
	if(neg)cout<<"-";
	cout<<cnt/17/29<<"."<<cnt/29%17<<"."<<cnt%29;
	return 0;
}



编辑于 2020-01-31 15:51:33 回复(0)

分析

  1. 边界检查,,超过int类型范围,需要使用long long类型(注意和long有区别)。

  2. 1016 程序运行时间 问题的一个类似处理,进制化简。

/*
 * app=PAT-Basic lang=c++
 * https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232
 */
#include <cstdio>
using namespace std;
int main()
{
    int G[2] = {}, S[2] = {}, K[2] = {};
    long long sum1, sum2, sub;
    scanf("%d.%d.%d %d.%d.%d", &G[0], &S[0], &K[0], &G[1], &S[1], &K[1]);
    sum1 = G[0] * 17 * 29 + S[0] * 29 + K[0];
    sum2 = G[1] * 17 * 29 + S[1] * 29 + K[1];
    sub = sum2 - sum1;
    if (sub < 0){
        printf("-");
        sub = -sub;
    }
    printf("%lld.%lld.%lld", sub / (17 * 29), sub % (17 * 29)/29,sub % 29);
    return 0;
}
发表于 2019-12-03 13:26:30 回复(0)
#include<stdio.h>
#include<stdlib.h>
int pandin(int a1,int a2,int a3,int b1,int b2,int b3);
void down(int a1,int a2,int a3,int b1,int b2,int b3);
int main()
{
 int a1,a2,a3,b1,b2,b3,k;
 char ch;
 scanf("%d%c%d%c%d %d%c%d%c%d",&a1,&ch,&a2,&ch,&a3,&b1,&ch,&b2,&ch,&b3);
 k=pandin(a1,a2,a3,b1,b2,b3);
 if(k==1)
 {
  down(a1,a2,a3,b1,b2,b3);
 }
 if(k==2)
 {
  printf("-");
  down(b1,b2,b3,a1,a2,a3);
 }
 system("pause");
 return 0;
}
int pandin(int a1,int a2,int a3,int b1,int b2,int b3)
{
 if((a1*10000+a2*100+a3)<=(b1*10000+b2*100+b3))
 {
  return 1;
 }
 else
 {
  return 2;
 }
}
void down(int a1,int a2,int a3,int b1,int b2,int b3)
{
 int num3,num2,num1;
 if(b3<a3)
 {
  num3=b3+29-a3;
  b2--;
 }
 else
 {
  num3=b3-a3;
 }
 if(b2<a2)
 {
  num2=b2+17-a2;
  b1--;
 }
 else
 {
  num2=b2-a2;
 }
 num1=b1-a1;
 printf("%d.%d.%d",num1,num2,num3);
}
发表于 2019-08-05 16:12:11 回复(0)
import java.util.*;
public class Main{
    public static void main(String []args){
         Scanner in=new Scanner(System.in);
         String p=in.next();
         String a=in.next();
         int P[]=new int[3];
         int A[]=new int[3];
         int count=0;
         for(String c:p.split("\\.")){
             P[count++]=Integer.valueOf(c);
         }
        count=0;
         for(String c:a.split("\\.")){
             A[count++]=Integer.valueOf(c);
         }
        int result[]=new int[3];
        if(A[0]>=P[0]) {
                if(A[2]>=P[2])
                {
                    result[2]=A[2]-P[2];
                }
                 else
                {
                    result[2]=A[2]-P[2]+29;
                    A[1]-=1;
                }
                 if(A[1]>=P[1])
                {
                    result[1]=A[1]-P[1];
                }
                 else
                {
                    result[1]=A[1]-P[1]+17;
                    A[0]-=1;
                }
                
                    result[0]=A[0]-P[0];
               System.out.print(result[0]+"."+result[1]+"."+result[2]);
        }
        else {
            if(P[2]>=A[2])
            {
                result[2]=P[2]-A[2];
            }
             else
            {
                result[2]=P[2]-A[2]+29;
                P[1]-=1;
            }
             if(P[1]>=A[1])
            {
                result[1]=P[1]-A[1];
            }
             else
            {
                result[1]=P[1]-A[1]+17;
                P[0]-=1;
            }
            
                result[0]=A[0]-P[0];
           System.out.print(result[0]+"."+result[1]+"."+result[2]);
        }
    }
}
编辑于 2019-05-05 18:20:31 回复(0)
#include<iostream>
#include<cstring>
 #include<string>
 #include<cstdio>
 #include<cmath>
 #include<algorithm>
 #include<sstream>
using namespace std;
 map<int,int> a;
 long long d=1000000007;
 map<int,long long> key;
 long long digui(int x)
 {
if(key[x]==0)
{
long long ans1=digui(x-1)%d;
long long ans2=digui(x-2)%d;
long long ans3=(long long)(double(log10(x))/double(log10(2)));
key[x]=(ans1+ans2+ans3)%d;
}
return key[x]; 
 }
 int a1,a2,a3,b1,b2,b3;
 int c1,c2,c3;
 int f1=0,f2=0;
 void check()
 {
c3=b3-a3;
if(c3<0)
{
c3+=29;
f2=1;
}
c2=b2-a2-f2;
if(c2<0)
{
c2+=17;
f1=1;
}
c1=b1-a1-f1;
 }
 int main(){

char c;
cin>>a1>>c>>a2>>c>>a3;
cin>>b1>>c>>b2>>c>>b3;
//cout<<b3;
check();
if(c1<0)
{
f1=0,f2=0;
swap(a1,b1);
swap(a2,b2);
swap(a3,b3);
check();
cout<<'-'<<c1<<'.'<<c2<<'.'<<c3<<endl;
}
else cout<<c1<<'.'<<c2<<'.'<<c3<<endl;
return 0;
}
 #include<map>

编辑于 2019-03-25 20:30:30 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String p=sc.next();
        String a=sc.next();
        String[] pMoney=p.split("\\.");
        String[] aMoney=a.split("\\.");
        int pTotal=Integer.valueOf(pMoney[0])*17*29+Integer.valueOf(pMoney[1])*29+Integer.valueOf(pMoney[2]);
        int aTotal=Integer.valueOf(aMoney[0])*17*29+Integer.valueOf(aMoney[1])*29+Integer.valueOf(aMoney[2]);
        int sight=1;
        int different=aTotal-pTotal;
        if(different<0){
            different=-different;
            sight=-sight;
        }
        int p1=different/(17*29);
        int p2=(different-p1*17*29)/29;
        int p3=(different-p1*17*29-p2*29);
        p1*=sight;
        System.out.println(p1+"."+p2+"."+p3);
    }
}

发表于 2018-09-29 00:43:27 回复(0)
try:
    while True:
        string = input().split()
        pay = list(map(int,string[0].split('.')))
        cost = list(map(int,string[1].split('.')))
        payNum = (pay[0]*17+pay[1])*29+pay[2]
        costNum = (cost[0]*17+cost[1])*29+cost[2]
        remaining = costNum-payNum
        if remaining<0:
            sign = "-"
            remaining = -remaining
        else:
            sign = ""
        result = [0,0,0]
        result[2] = remaining%29
        result[0],result[1] = divmod((remaining//29),17)
        print(sign+".".join(map(str,result)))

except Exception:
    pass
编辑于 2018-09-23 12:36:19 回复(0)
#include <stdio.h>
int main(){
 int C, m[6];
 scanf("%ld.%ld.%ld %ld.%ld.%ld", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5]);
 C = m[3]*29*17+m[4]*29+m[5] > (m[0]*29*17+m[1]*29+m[2]) ? m[3]*29*17+m[4]*29+m[5] - (m[0]*29*17+m[1]*29+m[2]) : m[0]*29*17+m[1]*29+m[2] - (m[3]*29*17+m[4]*29+m[5]);
 printf("%s%d.%d.%d", m[3]*29*17+m[4]*29+m[5] > (m[0]*29*17+m[1]*29+m[2]) ? "" : "-",C / (29 * 17), C / 29 % 17, C % 29);
 return 0;
}

发表于 2017-08-09 09:12:53 回复(0)
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner sc=new Scanner(System.in);
		String str1=sc.next();
		String str2=sc.next();
		String[] arr1=str1.split("\\.");
		int a1=Integer.parseInt(arr1[0]);
		int b1=Integer.parseInt(arr1[1]);
		int c1=Integer.parseInt(arr1[2]);
		//System.out.println(a1+" "+b1+" "+c1);
		String[] arr2=str2.split("\\.");
		int a2=Integer.parseInt(arr2[0]);
		int b2=Integer.parseInt(arr2[1]);
		int c2=Integer.parseInt(arr2[2]);
		//System.out.println(a2+" "+b2+" "+c2);
		int num2=(a2*17+b2)*29+c2;
		int num1=(a1*17+b1)*29+c1;
		String res=null;
		if(num2<num1){
			res="-"+myFunc(a1,b1,c1,a2,b2,c2);
		}else{
			res=myFunc(a2,b2,c2,a1,b1,c1);
		}
		System.out.print(res);
	}
	public static String myFunc(int a2,int b2,int c2,int a1,int b1,int c1){
		if(c2<c1){
			c2+=29;
			b2-=1;
		}
		int c=c2-c1;
		if(b2<b1){
			b2+=17;
			a2-=1;
		}
		int b=b2-b1;
		int a=a2-a1;
		return a+"."+b+"."+c;
	}

}


发表于 2015-09-21 21:00:09 回复(0)
#include <stdio.h>
#include <stdlib.h>

void swap(int *,int *);

int main()
{
	int borrow = 0;
	int flag = 0;
	int Gallon1 ,Sike1 ,Kult1 ;
	int Gallon2 ,Sike2 ,Kult2 ;
	char ch1,ch2;
	
	scanf("%d%c%d%c%d",&Gallon1,&ch1,&Sike1,&ch2,&Kult1);//应付的钱
	scanf("%d%c%d%c%d",&Gallon2,&ch1,&Sike2,&ch2,&Kult2);//实际带的钱
	if((Gallon1 > Gallon2)||((Gallon1 == Gallon2)&&(Sike1 > Sike2))||((Gallon1 == Gallon2)&&(Sike1 == Sike2)&&(Kult1 > Kult2)))
	{
		flag = 1;
		swap(&Gallon1,&Gallon2);
		swap(&Sike1,&Sike2);
		swap(&Kult1,&Kult2);
	}
	Kult2 = Kult2 - Kult1;
	if(Kult2 < 0)
	{
		Kult2 += 29;
		borrow = 1;
	}
	Sike2 = Sike2 - Sike1;
	if(borrow)
	{
		borrow = 0;
		Sike2--;
	}
	if(Sike2 < 0)
	{
		borrow = 1;
		Sike2 += 17;
	}
	Gallon2 = Gallon2 - Gallon1;
	if(borrow)
	{
		borrow = 0;
		Gallon2--;
	}
	if(flag)
		printf("-");
	printf("%d.%d.%d\n",Gallon2,Sike2,Kult2);
	return 0;
}

void swap(int *a,int *b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

发表于 2015-07-15 17:35:06 回复(0)
//这种题 也是没有谁了
//简单类 
#include<stdio.h>
#include<math.h>
int main(){
int a,b,c;
int x,y,z;
while(scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&x,&y,&z)!=EOF){
   if((a*17*29+b*29+c)>(x*17*29+y*29+z)) //先用这个判断谁大些  然后分两类 大减小 
{                                   //这是第一个输入大 
int k1,k2,n2=0;
int n1=29+c-z;
if(n1<29)
  n2=17+b-y-1;
else
  n2=17+b-y;
printf("-%d.%d.%d\n",n2>17?a-x:a-x-1,n2%17,n1%29); //这是第二个输入大  
}
else
{
int k1,k2,n2=0;
int n1=29+z-c;
if(n1<29)
  n2=17+y-b-1;
else
  n2=17+y-b;
printf("%d.%d.%d\n",n2>17?x-a:x-a-1,n2%17,n1%29);
}
   
}
return 0;
发表于 2016-09-03 20:10:09 回复(1)
29看成了19,提交了6次才过了这水题_(:з)∠)_
发表于 2018-08-30 13:48:26 回复(12)
思路://换算为最低单位数字进行比较,然后再转换位最高单位数组,[注意]scanf的使用算是比较好的了。
#include <iostream>
using namespace std;
//“十七个银西可(Sickle)兑一个加隆(Galleon),
//二十九个纳特(Knut)兑一个西可,很容易。
//Galleon.Sickle.Knut


int main()
{
    //Galleon.Sickle.Knut
    long galleon1,sickle1,knut1,galleon2,sickle2,knut2 = 0;
    scanf("%ld.%ld.%ld %ld.%ld.%ld",&galleon1,&sickle1,&knut1,&galleon2,&sickle2,&knut2);
    long sub = galleon2*17*29 + sickle2*29 + knut2 - galleon1*17*29 - sickle1*29 - knut1;
    sub>0?(1):(cout<<"-",sub=-1*sub);
    cout << sub/17/29 << "." << sub/29%17 << "." << sub%29;
}

发表于 2018-07-02 21:42:38 回复(1)
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    string str1,str2;
    cin >> str1 >> str2;
    int count=0;
    int  a1,b1,c1,a2,b2,c2;
   
    sscanf(str1.c_str(), "%d.%d.%d", &a1, &b1, &c1);
    sscanf(str2.c_str(), "%d.%d.%d", &a2, &b2, &c2);

    int sum = (a2*17*29+b2*29+c2) - (a1*17*29+b1*29+c1);
    int a = sum/(17*29);
    int b = sum/29%17;
    int c = sum%29;
    b = b>0 ? b : b*-1;
    c = c>0 ? c : c*-1;
    cout << a << "." << b << "." << c ;
         
    return 0;
}
发表于 2024-03-13 16:37:47 回复(0)
#include<bits/stdc++.h>
using namespace std;

int main() {
    int a,b,c;  //g=s*17,s=k*29;
	scanf("%d.%d.%d",&a,&b,&c);
	b+=a*17;
	c+=b*29;
	int q,w,e;
	scanf("%d.%d.%d",&q,&w,&e);
	w+=q*17;
	e+=w*29;
	int temp = e-c;
	if(temp<0){
		cout <<"-";
		temp = 0-temp;
	}
	//cout <<temp<<endl;
	b=temp/29;
	c=temp%29;
	a=b/17;
	b=b%17;
	printf("%d.%d.%d",a,b,c);
    return 0;
}

发表于 2023-03-24 19:22:53 回复(0)