7-10 Rhythm买娃哈哈 (10分) ---不妨找找规律

 

一瓶娃哈哈(玻璃瓶装的)两块钱,因为瓶身是玻璃瓶的比较贵,所以两个瓶身可以换一瓶娃哈哈。

你现在有4元钱,问最多能喝到多少瓶娃哈哈?

答案是4瓶。

一开始先用4元钱买两瓶娃哈哈喝掉,再用这两瓶的娃哈哈的瓶身换一瓶喝到,最后还剩一个瓶身,这个时候再朝小卖部的老板借一个瓶身。换一瓶娃哈哈喝掉之后再还给他一个瓶身。

现在问题来了,Rhythm有n元钱,然后Rhythm最多可以向老板借一个瓶身(注意要还的),问Rhythm最多能喝到多少瓶娃哈哈?

输入格式:

第一行是一个正整数T(T<=100)表示有T组案例。

对于每组案例,输入一个正整数(1<=n<=10^100)。

输出格式:

对于每组案例,输出一行一个正整数表示最多能够喝到的娃哈哈数目

输入样例:

1
1

输出样例:

0

 

 

 


题解

 

还是思路不够广。我只想到了模拟的思路,想着N不停除2,然后不同的情况。但试验后发现似乎很复杂,当时没看明白。

其实,这就是个简单的找规律题。顺便,为了让它还算有点难度,于是加上了大数(高精度)思想。

 

对应不同N,不同结果表

N元钱12345678910
喝到的瓶数0224466889

手算模拟时,就可以感觉到,额外多的1元钱是没用的,所以2和3,4和5,6和7对应的瓶数各个对应相等。

这一点要注意到,算是个细节。因为在我之前模拟的时候,常常会把N元钱直接当成空瓶来算。这1元钱混淆成1个空瓶子,而实际上1元钱没办法加上一个空瓶再换一瓶。这份混淆给我的结果带来很大影响。

 

规律挺明显的,奇数N与偶数N-1对应相等。偶数N对应瓶数就是N。

 

除此之外,就是题中的 1<=n<=10^100 。

n最大有100位,哪怕用long long ,为64位。数据范围为 - 2^63 ~ 2^63-1 ,右侧也就是 9,223,372,036,854,775,807,共19位,差得远呢。

所以自然要大数处理,也就是用数组一位一位存。

 

ac代码

#include<bits/stdc++.h>
using namespace std;

int main()
{
	int T;
	char a[1000];
	int result[1000];
	
	cin>>T;
	while(T--)
	{
		cin>>a;
		for(int i=0;a[i]!='\0';i++)	    
			result[i+1] = a[i]-'0';	//1~strlen
		
		if(result[strlen(a)]%2!=0)
		{
			result[strlen(a)]--;
		}
		
		for(int i=1;i<=strlen(a);i++)
			cout<<result[i];	
		cout<<endl;
	}
	return 0;
}

当然,这里有个小细节我没处理。也就是个位数的-1,如果它正好为0,便要从十位来取,十位为0,要取百位...

寻思它没这么刁钻,我也就没管,直接就过了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值