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<