解法一
#include<cstdio>
//十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可
//1 G = 17 S , 1 S = 29 Kint main(){int g1,s1,k1,g2,s2,k2,g3,s3,k3;scanf("%d.%d.%d",&g2,&s2,&k2);//定价 scanf("%d.%d.%d",&g1,&s1,&k1);//实付价 int flag = 0;if(g1*29*17+s1*29+k1<g2*29*17+s2*29+k2){//输出一定为负 flag = 1;g3=g1;//g3临时用来交换g1=g2;g2=g3;s3=s1;s1=s2;s2=s3; k3=k1;k1=k2;k2=k3;}//处理最小位 if(k1>=k2){k3=k1-k2;}else if(k1<k2&&s1>0){//自己不够找父亲借 k3=k1+29-k2;s1--;}else if(k1<k2&&g1>0){//父亲也不够找爷爷借 k3=k1+29-k2;g1--;s1+=16;}//处理第二位if(s1>=s2){s3=s1-s2;}else{//父亲不够找爷爷借 g1--;s3=s1+17-s2;}g3=g1-g2;if(flag){printf("-");}printf("%d",g3);printf(".");printf("%d",s3);printf(".");printf("%d\n",k3);return 0;
}
解法二
#include<cstdio>
//十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可
const int G = 29*17;
const int S = 29;int main(){int g1,s1,k1,knut1,g2,s2,k2,knut2,ans;scanf("%d.%d.%d",&g2,&s2,&k2);//定价 scanf("%d.%d.%d",&g1,&s1,&k1);//实付价 knut1=g1*G+s1*S+k1;knut2=g2*G+s2*S+k2;ans=knut1-knut2;if(ans<0){ans=-ans;printf("-");}printf("%d.%d.%d\n",ans/G,ans%G/S,ans%S); return 0;
}