人人网2017春季招聘编程题 - 题解
人人网春招的这三道编程题,第一道水题,第二道注意点细节,第三道是一道数论题。
原题链接:点这儿。
第一题:波形图
题目:
小明正在做物理实验,他在示波器上观察波形。在每一时刻,他能观察到两种可能的波形,一种是水平波形,由两个下划线组成:
__
。一种是脉冲波形,由一个斜杠和一个反斜杠组成:/\
。小明观察到一个水平波形就在数据表上记录一个减号
-
,观察到一个脉冲波形就在数据表上记录一个加号+
。如小明观察到波形__/\__/\/\__
,他就会记录-+-++-
。现在小明想实现纪录序列与波形之间的转化,你能帮助他吗?
解析:
边读取边输出就行了。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int T;
for (cin >> T; T--; ) {
string str;
cin >> str;
if (str[0] == '-' || str[0] == '+') {
for (int i = 0; i < (int)str.size(); i++)
cout << (str[i] == '-' ? "__" : "/\\");
} else {
for (int i = 0; i < (int)str.size(); i += 2)
cout << (str[i] == '_' ? "-" : "+");
}
cout << endl;
}
return 0;
}
第二题:
题目:
如你所知,中国素来有发红包的习俗。
新年要到了,小明想要知道朋友圈里每个人的收益。
每个人有
mi 数量的钱用来发红包,并且这笔钱会平均地发给ki 个人(收益得到的钱不再发红包)。而且发给每个人的钱都是整数。如果不能整除,发红包的人保留
mimodki 的钱。
解析:
这一题也没什么好讲的,按照题中给出的规则模拟就行了,不过要注意一点就是编码的技巧,这一点在代码中有体现,还有就是题中加粗的这句话,发红包的人发红包的人保留
mimodki 的钱,那么其余的钱还是要发给其他人,一开始我就是这里没注意。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
vector<string> arrName((cin >> n, n));
map<string, int> mp;
for (int i = 0; i < n; cin >> arrName[i++]);
for (int i = 0; i < n; mp[arrName[i++]] = 0);
for (int cnt = 0; cnt < n; ++cnt) {
string name;
int m, k;
cin >> name >> m >> k;
if (k == 0)
continue;
int mon = m / k;
mp[name] -= m - m % k;
for (int i = 0; i < k; i++) {
string people;
cin >> people;
mp[people] += mon;
}
}
for (int i = 0; i < (int)arrName.size(); i++)
cout << arrName[i] << " " << mp[arrName[i]] << endl;
return 0;
}
第三题:神奇的规律
题目:
小明学习数学的时候发现两个神奇的规律:
假设现在有一个十进制数字
n=a0∗1+a1∗10+a2∗102+a3∗103+.....+ak∗10k 。要判断
n
能否被3
整除,只需要验证各位和能否被3
整除,即sum=a0+a1+a2+....+ak 能否被3
整除。如果sum
能被3
整除,那么n
就能被3
整除。要判断
n
能否被11
整除,只需要验证偶数位和与奇数位和的差能否被11
整除,即
diff=(a0+a2+a4+....)−(a1+a3+a5+...) 能否被11
整除。如果diff
能被11
整除,那么n
就能被11
整除。例如
81
和1243
可以用上述方法分别验证能否被3
和11
整除。现在小明想让你帮忙写段程序求出
b
进制下分别满足上述规律的最小的x
和最小的y
。即
n=a0∗1+a1∗b+a2∗b2+a3∗b3+.....+ak∗bk ,
n
能被xi 整除,当且仅当sum=a0+a1+a2+....+ak 能被xi 整除,x
为最小的xi 。
n
能被yi 整除,当且仅当diff=(a0+a2+a4+.....)−(a1+a3+a5+.....) 能被yi 整除,y
为最小的yi 。
解析:
这个题要做出来首先要知道数论中一个很基础也很重要的理论:
(a+b)%c=a%c+b%c (a∗b)%c=(a%c)∗(b%c)%c 有了这两个东西,这个题就很好解决了;
n%c=(a0∗1+a1∗b+a2∗b2+a3∗b3+.....+ak∗bk)%c=a0∗1%c+a1∗b%c+a2∗b2%c+a3∗b3%c+.....+ak∗bk%c
如果能找到一个c 满足bi%c=1 ,那么就可以得到sum ;如果能找到一个c 满足bi%c=−1 那么就可以得到diff 。解释下
diff ,b%c=−1,b2%c=(b%c)∗(b%c)%c=1,b3%c=(b2%c)∗(b%c)%c=−1,⋯ 。
代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int b;
while (cin >> b) {
int x, y;
for (x = 2; (b - 1) % x; x++);
for (y = 2; (b + 1) % y; y++);
cout << x << " " << y << endl;
}
return 0;
}