PAT每日三题

1122 找奇葩

分数 20

作者 陈越

单位 浙江大学

在一个长度为 n 的正整数序列中,所有的奇数都出现了偶数次,只有一个奇葩奇数出现了奇数次。你的任务就是找出这个奇葩。

输入格式:

输入首先在第一行给出一个正整数 n(≤104),随后一行给出 n 个满足题面描述的正整数。每个数值不超过 105,数字间以空格分隔。

输出格式:

在一行中输出那个奇葩数。题目保证这个奇葩是存在的。

输入样例:

复制代码
12
23 16 87 233 87 16 87 233 23 87 233 16

输出样例:

复制代码
233
cpp 复制代码
/* 1122 找奇葩 */
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;


int main() {

	unordered_map<int,int> map;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		int m;
		cin >> m;
		if (m % 2 != 0) {
			map[m]++;
		}
	}
	for (auto i : map) {
		if (i.second % 2 != 0) {
			cout << i.first << endl;
		}
	}


	return 0;
}

1123 舍入

分数 20

作者 陈越

单位 浙江大学

不同的编译器对浮点数的精度有不同的处理方法。常见的一种是"四舍五入",即考察指定有效位的后一位数字,如果不小于 5,就令有效位最后一位进位,然后舍去后面的尾数;如果小于 5 就直接舍去尾数。另一种叫"截断",即不管有效位后面是什么数字,一概直接舍去。还有一种是"四舍六入五成双",即当有效位的后一位数字是 5 时,有 3 种情况要考虑:如果 5 后面还有其它非 0 尾数,则进位;如果没有,则当有效位最后一位是单数时进位,双数时舍去,即保持最后一位是双数。

本题就请你写程序按照要求处理给定浮点数的舍入问题。

输入格式:

输入第一行给出两个不超过 100 的正整数 N 和 D,分别是待处理数字的个数和要求保留的小数点后的有效位数。随后 N 行,每行给出一个待处理数字的信息,格式如下:

复制代码
指令符 数字

其中指令符是表示舍入方法的一位数字,1 表示"四舍五入",2 表示"截断",3 表示"四舍六入五成双";数字是一个总长度不超过 200 位的浮点数,且不以小数点开头或结尾,即 0.123 不会写成 .123123 也不会写成 123.。此外,输入保证没有不必要的正负号(例如 -0.0+1)。

输出格式:

对每个待处理数字,在一行中输出根据指令符处理后的结果数字。

输入样例:

复制代码
7 3
1 3.1415926
2 3.1415926
3 3.1415926
3 3.14150
3 3.14250
3 3.14251
1 3.14

输出样例:

复制代码
3.142
3.141
3.142
3.142
3.142
3.143
3.140
cpp 复制代码
#include<iostream>
#include<string>
using namespace std;

//进位逻辑还需多次写
string fun(string s) {
	int carry = 1;
	if (s[0] == '-') {
		s = s.substr(1);
		for (int i = s.size() - 1; i >= 0 && carry; i--) {
			int t = s[i] - '0' + carry;
			if (s[i] == '.') continue;
			if (t >= 10) {
				s[i] = t - 10 + '0';
				carry = 1;
			}
			else {
				s[i] = t + '0';
				carry = 0;
			}
		}
		if (carry) {
			s = '1' + s;
		}
		s = '-' + s;
	}
	else {
		for (int i = s.size() - 1; i >= 0 && carry; i--) {
			int t = s[i] - '0' + carry;
			if (s[i] == '.') continue;
			if (t >= 10) {
				s[i] = t - 10 + '0';
				carry = 1;
			}
			else {
				s[i] = t + '0';
				carry = 0;
			}
		}
		if (carry) {
			s = '1' + s;
		}
	}
	
	
	return s;
}


int main() {

	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++) {
		int o;
		string s;
		cin >> o >> s;
		//四舍五入,注意进位,注意为9,注意最开始进位
		string r;
		int p = s.find('.');
		if (p == string::npos) {
			r = s.substr(0) + '.';
			int j = 0;
			while (j < m) {
				r += '0';
				j++;
			}
		}
		else {
			string st = s.substr(0, p);
			string en = s.substr(p+1);
			//多补一位
			while (en.size() < m+1) {
				en += '0';
			}
			/*string s = st + '.' + en;*/
			if (o == 1) {
				//四舍五入
				if (en[m] < '5') {
					r = st + '.' + en.substr(0, m);
				}
				else {
					r = st + '.' + en.substr(0, m);
					r = fun(r);
				}
			}
			else if (o == 2) {
				r = st + '.' + en.substr(0, m);
			}
			else if (o == 3) {
				//<'5'
				if (en[m] < '5') {
					r = st + '.' + en.substr(0, m);
				}
				else if (en[m] > '5') {
					r = st + '.' + en.substr(0, m);
					r = fun(r);
				}
				else {
					int f = 0;
					int j = m + 1;
					while (j < en.size()) {
						if (en[j] != '0') {
							f = 1;
							break;
						}
						j++;
					}
					if (f == 1) {
						r = st + '.' + en.substr(0, m);
						r = fun(r);
					}
					else if ((en[m - 1] - '0') % 2 != 0) {
						r = st + '.' + en.substr(0, m);
						r = fun(r);
					}
					else {
						r = st + '.' + en.substr(0, m);
					}
				}
				
			}
			
		}
		//判断不为-0  -0.00000001
		if (r[0] == '-') {
			bool fh = true;
			for (char c : r) {
				if (c != '.' && c != '-' && c != '0') {
					fh = false;
					break;
				}
			}
			if (fh) {
				r = r.substr(1);
			}
		}
		
		
		
		cout << r << endl;
		
	}


	return 0;
}

1124 最近的斐波那契数

分数 20

作者 陈越

单位 浙江大学

斐波那契数列 Fn​ 的定义为:对 n≥0 有 Fn+2​=Fn+1​+Fn​,初始值为 F0​=0 和 F1​=1。所谓与给定的整数 N 最近的斐波那契数是指与 N 的差之绝对值最小的斐波那契数。

本题就请你为任意给定的整数 N 找出与之最近的斐波那契数。

输入格式:

输入在一行中给出一个正整数 N(≤108)。

输出格式:

在一行输出与 N 最近的斐波那契数。如果解不唯一,输出最小的那个数。

输入样例:

复制代码
305

输出样例:

复制代码
233
cpp 复制代码
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;


int main() {

	int n;
	cin >> n;
	int pr = 0;
	int cur = 1;
	int af = 0;
	if (n == 1) {
		cout << n;
	}
	else {
		while (cur < n) {
			af = pr + cur;
			pr = cur;
			cur = af;
		}

		if (abs(n - pr) <= abs(cur - n)) {
			cout << pr;
		}
		else {
			cout << af;
		}
	}
	

	return 0;
}
相关推荐
进击的炸酱面3 小时前
第三章 线性模型
人工智能·算法·机器学习
立志成为大牛的小牛3 小时前
数据结构——三十一、最小生成树(王道408)
数据结构·学习·程序人生·考研·算法
CoovallyAIHub4 小时前
一致性模型:单步生成高质量图像,破解扩散模型速度瓶颈
深度学习·算法·计算机视觉
JMzz4 小时前
Rust 中的数据结构选择与性能影响:从算法复杂度到硬件特性 [特殊字符]
开发语言·数据结构·后端·算法·性能优化·rust
CoovallyAIHub4 小时前
搞定边缘AI部署:开源神器RamaLama,让视觉语言模型无处不在
深度学习·算法·计算机视觉
CyberSoma4 小时前
机器人模仿学习运动基元数学编码方法还有用吗?
人工智能·算法·计算机视觉·机器人
CoovallyAIHub4 小时前
英伟达再出「神作」!黄仁勋华盛顿GTC宣布Vera Rubin超级芯片,联手诺基亚进军6G,市值直逼5万亿美元
深度学习·算法·计算机视觉
黑菜钟5 小时前
代码随想录第50天 | 图论 基础介绍(新篇章
算法·深度优先·图论
草莓熊Lotso5 小时前
《算法闯关指南:优选算法--前缀和》--27.寻找数组的中心下标,28.除自身以外数组的乘积
开发语言·c++·算法·rpc