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不会写成.123,123也不会写成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;
}