1037 在霍格沃茨找零钱 (20 分)
题目链接:1037 在霍格沃茨找零钱 (20 分)
这道题目刚开始用了一个很笨的方法,后来觉得太low,于是上网借鉴
方法一(代码1):
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int a,b,c,a1,b1,c1; 5 bool cmp(void) 6 { 7 if(a!=a1) 8 return a<a1; 9 if(b!=b1) 10 return b<b1; 11 if(c!=c1) 12 return c<c1; 13 return true; 14 } 15 int main() 16 { 17 18 scanf("%d.%d.%d %d.%d.%d",&a,&b,&c,&a1,&b1,&c1); 19 int a2,b2,c2; 20 bool sign=cmp();//false为-,true为+ 21 if(!sign) 22 { 23 if(c>=c1) 24 c2=c-c1; 25 else 26 { 27 c2=c-c1+29; 28 b--; 29 } 30 if(b>=b1) 31 b2=b-b1; 32 else 33 { 34 b2=b-b1+17; 35 a--; 36 } 37 a2=a-a1; 38 cout<<"-"<<a2<<"."<<b2<<"."<<c2<<endl; 39 } 40 else 41 { 42 if(c1>=c) 43 c2=c1-c; 44 else 45 { 46 c2=c1-c+29; 47 b1--; 48 } 49 if(b1>=b) 50 b2=b1-b; 51 else 52 { 53 b2=b1-b+17; 54 a1--; 55 } 56 a2=a1-a; 57 cout<<a2<<"."<<b2<<"."<<c2<<endl; 58 } 59 60 return 0; 61 } 62 /* 63 10.16.27 64 14.1.28 65 10.16.27 66 */
方法二(代码2):其实以前做时分秒时用过,但是这次没有融会贯通!
解题思路:把输入的钱数化成最小单位,即换成Knut,然后两数做差,最后再换算成Gallen.Sickle.Knut的形式。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int main() 5 { 6 int a1,b1,c1,a2,b2,c2; 7 scanf("%d.%d.%d %d.%d.%d",&a1,&b1,&c1,&a2,&b2,&c2); 8 int P,A; //应付和实付用最小单位 9 P=A=0; 10 P+=(c1+(17*a1+b1)*29); 11 A+=(c2+(17*a2+b2)*29); 12 if(P>A) 13 cout<<"-"; 14 int ans=abs(P-A); 15 int a=ans/17/29; 16 int b=ans%(17*29)/29; 17 int c=ans%(17*29)%29; 18 printf("%d.%d.%d\n",a,b,c); 19 return 0; 20 }
类比hh::mm:ss
注意/和%的区别
/a/b=/(a*b)
%a%b !=%(a*b)