34005 - 汽水瓶(有意思)
时间限制 : 1 秒
内存限制 : 128 MB
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
样例
输入
3 10 81 0
输出
1 5 40
#include<iostream>
using namespace std;
int main() {
int N;
while (true) {
cin >> N;
if (!N) {
break;
}
else {
int r = N % 3;//不能兑换的瓶子
int exchange = N / 3;//可兑换的瓶子
int sum = r + exchange;//喝完后的瓶子加上之前不能兑换的瓶子
int count = exchange;//喝水的总数
while (sum >= 2) {
if (sum == 2) {
count++;
break;
}
else {
r = sum % 3;
exchange = sum / 3;
count += exchange;
sum = r + exchange;
}
}
cout << count << endl;
}
}
return 0;
}
分析:这道题挺有意思,就是用空瓶子换水喝的问题,这类题还是比较常见,但是这个题要注意当手里有2个瓶子的情况,从老板手里借一瓶水,喝完后凑成3个瓶子,此时又可以换一瓶水,而这瓶水刚好还给老板。
是否通过:
34007 - 高精度加法(大数运算)
时间限制 : 1 秒
内存限制 : 128 MB
计算两个非负整数之和
输入
从键盘上输入两个非负整数,每个数占一行,每个数的位数不超过240
输出
输出只有一行为两个数之和。
样例
输入
12 13
输出
25
答案:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
//字符转为数字
inline int f(char c) {
switch (c) {
case '0':
case'\0':
return 0;
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
}
}
int main() {
char a[300] = { 0 }, b[300] = { 0 }, sum[300] = { 0 };//数组a、b分别表示两个加数,sum表示和
cin >> a>>b;//输入数据
//逆序
int a_len = strlen(a);
int b_len = strlen(b);
for (int i = 0, j = a_len - 1; i < j; i++, j--) {
int tem = a[i];
a[i] = a[j];
a[j] = tem;
}
for (int i = 0, j = b_len - 1; i < j; i++, j--) {
int tem = b[i];
b[i] = b[j];
b[j] = tem;
}
//求出加数较大的位数
int max = a_len > b_len ? a_len : b_len;
int jw = 0,SUM=0;
int length = 0;
//高精度加法
for (int i = 0; i < max; i++) {
SUM = f(a[i]) + f(b[i])+jw;
jw = SUM / 10;
sum[i] = SUM % 10 + 48;//数字转为字符
length++;
}
//最高位进位不为0,则和的位数加1
if (jw != 0) {
sum[length] = jw + 48;
length++;
}
for (int i = length - 1; i >= 0; i--) {
cout << sum[i];
}
return 0;
}
分析:这个题可能有人上来就直接用普通的加法进行算术运算,你想想,都到这里了,可能只是简单的算术运算吗??高精度加法运算就是大数运算,就是每个数非常大,long long类型完全放不下那种,此时我们就要用到高精度计算。先回顾小学学的加法运算:
就是从低位开始计算,大于10,向前进位,然后这个位等于这个数和10取余的值。但是计算机中,
首先你不可能用int数组来存每一位,得用char数组来存取两个加数 的每一位
其次,现实中我们是从右往左计算,但是计算机存储的时候只能从低位开始存,1234存到计算机也是1234,但是这不方便进行加法运算,因为要从4开始向前运算,操作有点不方便,因此我们把它逆转,在做加法,如下:
这样 操作对计算机来说就非常又好了,也便于计算。但是要注意最高位进位,比如55+55=110,因为最高位进位为1,此时要判断最高位进位是否不为0,如果不为0,和的位数要加1!
是否通过: