C++编程题之将功赎过和约德尔测试
2016-09-25 16:15
225 查看
这两道题是在某网站做在线编程题遇到的,感觉挺有意思。以下是原版问题描述。
问题1:将功赎过:
小赛是一名幸运的程序员。
虽然他成功帮助小朋友以最快时间夺回了狼堡,但是面试官却打算和他说拜拜了。
理由是——游戏天赋太高,有不务正业、走火入魔的倾向QAQ……
尽管小赛很不能接受这个理由,可是却只能心灰意冷地吃下这个结果。
然而,在他即将走出门的时候,面试官给了幸运的小赛一个最后的机会。
原来,面试官的手机被他调皮的儿子小明用一个数字作为密码锁上了。
小明只记得这个数字的十进制范围是l~r,且这个数的二进制表示中恰有m个1,却不记得确切的数字了。
面试官可急坏了。这才有了小赛一个将功赎过的机会。
他想要让小赛算出,他最坏情况下,要试多少次密码才能确保打开手机呢?
请输出这个次数。
输入
输入仅一行,包含三个整数l,r,m,其中l,r表示这个数的十进制范围是l~r,m表示这个数的二进制表示中有m个1.
数据保证——
对于30%的测试点,0<=l<=r<=20,0<=m<=5,
对于70%的测试点,0<=l<=r<=1000,0<=m<=10,
对于100%的测试点,0<=l<=r<=2000000,0<=m<=24.
输出
输出一行,包含一个整数,表示面试官最坏情况下,要试多少次密码才能确保打开手机。
如果小明记错了(也就是不存在任何一个数满足),则输出”-1”(不含引号)。
以下是我的代码:
问题2:约德尔测试
兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。
请问:相似率为多少?
输入
每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得到的字符串。
(两个字符串的长度相等,字符串长度不小于1且不超过1000。)
输出
输出一行,在这一行输出相似率。用百分数表示。(相似率为相同字符的个数/总个数,精确到百分号小数点后两位。printf(“%%”);输出一个%。)
以下我的代码(String类型确实方便):
某大神代码(膜拜一下)
问题1:将功赎过:
小赛是一名幸运的程序员。
虽然他成功帮助小朋友以最快时间夺回了狼堡,但是面试官却打算和他说拜拜了。
理由是——游戏天赋太高,有不务正业、走火入魔的倾向QAQ……
尽管小赛很不能接受这个理由,可是却只能心灰意冷地吃下这个结果。
然而,在他即将走出门的时候,面试官给了幸运的小赛一个最后的机会。
原来,面试官的手机被他调皮的儿子小明用一个数字作为密码锁上了。
小明只记得这个数字的十进制范围是l~r,且这个数的二进制表示中恰有m个1,却不记得确切的数字了。
面试官可急坏了。这才有了小赛一个将功赎过的机会。
他想要让小赛算出,他最坏情况下,要试多少次密码才能确保打开手机呢?
请输出这个次数。
输入
输入仅一行,包含三个整数l,r,m,其中l,r表示这个数的十进制范围是l~r,m表示这个数的二进制表示中有m个1.
数据保证——
对于30%的测试点,0<=l<=r<=20,0<=m<=5,
对于70%的测试点,0<=l<=r<=1000,0<=m<=10,
对于100%的测试点,0<=l<=r<=2000000,0<=m<=24.
输出
输出一行,包含一个整数,表示面试官最坏情况下,要试多少次密码才能确保打开手机。
如果小明记错了(也就是不存在任何一个数满足),则输出”-1”(不含引号)。
以下是我的代码:
#include<iostream> using namespace std; int cnt_one(int i) { int sum=0; while(i) { //这步很重要,仔细理解 i=i&(i-1); sum++; } return sum; } int main() { int l,r,m,i,num; while(cin>>l>>r>>m) { if(l<0||r<0||l>r||l>2000000||r>2000000||m<0||m>24) return 0; num=0; for(i=l;i<=r;i++) { if(cnt_one(i)==m) num++; } if(num>0) cout<<num<<endl; else cout<<-1<<endl; } return 0; }
问题2:约德尔测试
兰博和提莫闲聊之后,回归到了他们的正题,约德尔人的未来。
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。
请问:相似率为多少?
输入
每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得到的字符串。
(两个字符串的长度相等,字符串长度不小于1且不超过1000。)
输出
输出一行,在这一行输出相似率。用百分数表示。(相似率为相同字符的个数/总个数,精确到百分号小数点后两位。printf(“%%”);输出一个%。)
以下我的代码(String类型确实方便):
#include<iostream> #include<string> #include<iomanip> using namespace std; double furtureP(string future, string stars) { int numF = future.size(); int numS = stars.size(); int simNum = 0; if (numF != numS) { return 0; } if (numF<1 || numF>1000) { return 0; } for (int i = 0; i<numF; i++) { if ((future[i]>='a'&& future[i]<='z') || (future[i]>='A'&&future[i]<='Z') || (future[i]>='0' && future[i]<='9')) { if (stars[i] == '1') { simNum++; } } else { if (stars[i] == '0') { simNum++; } } } double simPrecent = 0; simPrecent = double(simNum) / double(numF); return simPrecent; } int main() { double precent = 0.0; string sF, sS; while (cin >> sF >> sS) { precent = furtureP(sF, sS); cout << setiosflags(ios::fixed); cout << setprecision(2) << precent * 100 << "%" << endl; } return 0; }
某大神代码(膜拜一下)
#include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #include<string> using namespace std; string a,b; bool isAlph(char &c) { return ((c>='a'&&c<='z')||(c>='A'&&c<='Z')); } bool isNum(char &c) { return (c>='0'&&c<='9'); } bool isOne(char &c) { return (isAlph(c)||isNum(c)); } int main () { cin>>a>>b; int l = a.length(); int cnt = 0; for(int i=0;i<l;++i) { if(isOne(a[i])^(b[i]=='1')) continue; ++cnt; } double ans = cnt*100.0/l; printf("%.2lf%%\n", ans); }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- android 代码实现控件之间的间距
- [Android]在代码里运行另一个程序的方法
- 关于指针的一些事情
- 肯特·贝克:改变人生的代码整理魔法
- 你应该学习哪种编程语言?
- c++ primer 第五版 笔记前言
- [转]我们需要一种其他人能使用的编程语言
- share_ptr的几个注意点
- 只有程序员看的懂的面试圣经|如何拿下编程面试
- 下一次技术面试时要问的 3 个重要问题
- 网页恶意代码的预防
- DB2编程序技巧(1)
- DB2编程序技巧 (四)
- 女人VS编程_国庆快乐
- DB2编程序技巧 (六)
- DB2编程序技巧 (三)
- DB2编程序技巧 (九)
- DB2编程序技巧 (七)