PTA(Basic Level) 1037:在霍格沃茨找零钱(C语言实现)

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;
}
发布了5 篇原创文章 · 获赞 0 · 访问量 23

猜你喜欢

转载自blog.csdn.net/LIve1AnD1LeARN/article/details/105031182