您的位置:首页 > 编程语言 > C语言/C++

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”(不含引号)。

以下是我的代码:

#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++ 编程 代码 面试