PTA(Basic Level) 1037:在霍格沃茨找零钱(C语言实现)
分析:如果大数减小数,和十进制减法一样,只是每一位进位不同;如果是小数减大数,就得输出符号,并且用大数减小数。
刚开始就像十进制一样计算,答案正确,但代码偏长,于是借鉴了一下别人的代码,将Galleon和sickle都转换为Knut之后分别计算G、S、K的值,像计算三位整数各位数字一样计算,注意各位进制不同,最高位的权重为17*29,第二位为29,第三位为1。
修改代码
#include <stdio.h>
#include <math.h>
int main()
{
int g1,s1,k1,g2,s2,k2,g,s,k,t;
scanf("%d.%d.%d %d.%d.%d",&g1,&s1,&k1,&g2,&s2,&k2);
k1+=g1*17*29+s1*29;
k2+=g2*17*29+s2*29;
if(k2<k1)
putchar('-');
t=abs(k2-k1);
g=t/(17*29);
s=t/29%17;
k=t%29;
printf("%d.%d.%d",g,s,k);
return 0;
}
原来代码
#include <stdio.h>
int g=0,s=0,k=0;
int cmp(int g2,int s2,int k2,int g1,int s1,int k1)//比较大小
{
if(g2<g1)
return 1;
if(g2==g1 && s2<s1)
return 1;
if(g2==g1 && s2==s1 && k2<k1)
return 1;
return 0;
}
void sub(int g2,int s2,int k2,int g1,int s1,int k1)//用大的减小的
{
if(k2<k1)
{
k=(k2+29)-k1;
s2-=1;
}
else
k=k2-k1;
if(s2<s1)
{
s=(s2+17)-s1;
g2-=1;
}
else
s=s2-s1;
g=g2-g1;
}
int main()
{
int g1,s1,k1,g2,s2,k2;
scanf("%d.%d.%d %d.%d.%d",&g1,&s1,&k1,&g2,&s2,&k2);
if(cmp(g2,s2,k2,g1,s1,k1))//没带够钱
{
putchar('-');
sub(g1,s1,k1,g2,s2,k2);
}
else
sub(g2,s2,k2,g1,s1,k1);
printf("%d.%d.%d",g,s,k);
return 0;
}