问题描述:从一系列输入的数中找某数出现的次数,输入是一系列数和要查找的数,输出是次数。

这个问题是坐火车的时候群里一位朋友的问的,还要求用C++实现,结果他们学的是C式的C++,于是想用纯的C++解决一下这个问题。因为在火车上,只能用手机编程,高铁跑出100公里我还没敲完,下车了。回来又继续写,发现之前写的还是错的,折腾了一个对的版本。

C++ (C++11)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// g++ a.cpp -o a.out
// ./a.out
#include <iostream>
#include <vector>
#include <algorithm>

int main(void) {
std::vector <int> v;
int find = 0;
int input = 0;
std::cout << "Input numbers, enter -1 to end:" << std::endl;
while (std::cin >> input && input != -1) {
v.push_back(input);
}
std::cout << "Find: ";
std::cin >> find;
auto found = std::count(v.begin(), v.end(), find);
std::cout << "Found " << found << " times." << std::endl;
return found;
}

或者还有一种简单的实现方法,不用-1结束输入,而是用EOF (*nix世界用Ctrl+D,Windows用Ctrl+Z后回车)结束输入,然后cin.clear(),继续写后面的就行。但这种写法在手机上和Windows的MSYS2环境里都出错。

上面的代码可以在手机上编译运行,安卓手机装Termux后再装Clang就好。话说Clang不是效率高么,这么个破代码编译要好几秒,Termux里压根没GCC,唉。

这个代码用了自动类型(其实就一个int),所以必须C++11以上才行。

Node.js

现在(Node.js 10.5.0)已经支持原生大数(BigInt)了,我觉得Node.js有可能变成一种可以用于ACM的语言,而且Node.js不用编译,跨平台还高效。这个题其实也是ACM题,只不过是最容易的那种。

花了一点时间边查边写,写出来了,这个输入输出真别扭啊。这个代码和上面的代码一样,用了比较新的技术,必须比较高的版本才能运行,对于自娱自乐来说很合适。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'use strict';

// node a.js

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

let v = [];

console.log('Input numbers, -1 to end:');

rl.on('line', (line) => {
// console.log(`Received: ${line}`);
if (line === '-1') {
console.log('Done.');
rl.question('Find? ', (find) => {
console.log('Found ' + v.filter((e) => {
return e === parseInt(find, 10);
}).length + ' times.');
rl.close();
});
}
let num = parseInt(line, 10);
if (num.isNaN)
rl.close();
v.push(num);
}).on('close', () => {
process.exit(0);
});

应该很容易改成支持大数的版本。

试了一下,随便输入一个很大的数,上面的代码是可以正常工作的,但好像并不是因为用了大数而是转成了浮点数?我也不知道。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
'use strict';

// node a.js

const readline = require('readline');

const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});

let v = [];

console.log('Input numbers, -1 to end:');

rl.on('line', (line) => {
// console.log(`Received: ${line}`);
if (line === '-1') {
console.log('Done.');
rl.question('Find? ', (find) => {
try {
const t = BigInt(find);
console.log('Found ' + v.filter((e) => {
return e === t;
}).length + ' times.');
}
catch (err) {
console.error(err);
process.exit(-1);
}
rl.close();
});
}
try {
const num = BigInt(line);
if (num != line)
rl.close();
v.push(num);
}
catch (err) {
console.error(err);
process.exit(-1);
}
}).on('close', () => {
process.exit(0);
});

WDYT?