一瓶娃哈哈(玻璃瓶装的)两块钱,因为瓶身是玻璃瓶的比较贵,所以两个瓶身可以换一瓶娃哈哈。
你现在有4元钱,问最多能喝到多少瓶娃哈哈?
答案是4瓶。
一开始先用4元钱买两瓶娃哈哈喝掉,再用这两瓶的娃哈哈的瓶身换一瓶喝到,最后还剩一个瓶身,这个时候再朝小卖部的老板借一个瓶身。换一瓶娃哈哈喝掉之后再还给他一个瓶身。
现在问题来了,Rhythm有n元钱,然后Rhythm最多可以向老板借一个瓶身(注意要还的),问Rhythm最多能喝到多少瓶娃哈哈?
输入格式:
第一行是一个正整数T(T<=100)表示有T组案例。
对于每组案例,输入一个正整数(1<=n<=10^100)。
输出格式:
对于每组案例,输出一行一个正整数表示最多能够喝到的娃哈哈数目
输入样例:
1
1
输出样例:
0
题解
还是思路不够广。我只想到了模拟的思路,想着N不停除2,然后不同的情况。但试验后发现似乎很复杂,当时没看明白。
其实,这就是个简单的找规律题。顺便,为了让它还算有点难度,于是加上了大数(高精度)思想。
对应不同N,不同结果表
N元钱 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
喝到的瓶数 | 0 | 2 | 2 | 4 | 4 | 6 | 6 | 8 | 8 | 9 |
手算模拟时,就可以感觉到,额外多的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,要取百位...
寻思它没这么刁钻,我也就没管,直接就过了。