OJ刷题 第十七篇()

发布时间:2024年01月05日

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

是否通过:

?

文章来源:https://blog.csdn.net/qq_51956388/article/details/130690726
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。