pat乙1037-在霍格沃兹找零钱

代码1

(但是通过不了测试点4)

代码1思路:

以字符串读入,然后转数字,这样字符串大小就可以直接比较看是否是负数

#include<iostream>
using namespace std;
int pi,pj,pk,ai,aj,ak,a,b,c;
void func(int ai,int aj,int ak,int pi,int pj,int pk)
{
    if(ak<pk)
    {
        ak+=29;aj--;
        ak-=pk;
    }
    else{
        ak-=pk;
    }
    if(aj<pj)
    {
        aj+=17;ai--;
        aj-=pj;
    }
    else{
        aj-=pj;
    }
    cout<<ai-pi<<'.'<<aj<<'.'<<ak;
    
    
}
int main()
{
	string p,a;cin>>p>>a;
	//判断负数
	int f=0;
	if(p>a)
	{
		f=1;
	}
	//字符串转数字
	int m=0,n=0;
	for(int i=0;n<2&&i<p.size();i++)
	{
		if(p[i]=='.')
		{
			if(n==0)
			{
				pi=stoi(p.substr(m,i-m));
			}
			if(n==1)
			{
				pj=stoi(p.substr(m,i-m));
			}
			
			m=i+1;
			n++;
		}
	}
	pk=stoi(p.substr(m));
	m=0,n=0;
	for(int i=0;n<2&&i<a.size();i++)
	{
		if(a[i]=='.')
		{
			if(n==0)
			{
				ai=stoi(a.substr(m,i-m));
			}
			if(n==1)
			{
				aj=stoi(a.substr(m,i-m));
			}
			
			m=i+1;
			n++;
		}
	}
	ak=stoi(a.substr(m));


    if(f){
        cout<<'-';
        func(pi,pj,pk,ai,aj,ak);
    }
    else{
        func(ai,aj,ak,pi,pj,pk);
    }

    
    return 0;
}

知识点:

字符串转int:stoi()

截取字符串:substr()

代码2

(偷别人的,AC了)

代码2思路:

统一进制,可以都统一成“个位”,想理解统一成sum和把sum再%29/17的操作可以类比十进制的个十百位:

个*10=十        十*10=百        

“个”*29=“十”   “十”*17=“百”

想对单位是“个”的sum保留“个位”,得除以“10”,即“29”,即个位到十位的一个进制(以此类推)

#include<iostream>
using namespace std;
int pi,pj,pk,ai,aj,ak,i,j,k;
int main()
{
	scanf("%d.%d.%d %d.%d.%d",&pi,&pj,&pk,&ai,&aj,&ak);
	long long sum=ak-pk+29*(aj-pj+17*(ai-pi));
	if(sum<0)
	{
		cout<<'-';
		sum=-sum;
	}
	k=sum%29;
	j=sum/29%17;
	i=sum/29/17;
	cout<<i<<'.'<<j<<'.'<<k;

    return 0;
}

知识点:

1进制(见思路)

2当我们先将它们都转成“个位”,然后作差之后,就只用把差值(个位)再转为他规定的进制既可,中间只是考虑一个负数问题,说白了还是差的绝对值

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值