目录
第一题-抄送列表
思路:
分别用两个字符串str和sub分别接收列表和要查找的姓名,遍历str,遇到引号,则继续查找下一个引号出现的位置,然后将引号中间的字符串拷贝到vector当中,没有遇到引号,如果找到尾,则将下一次逗号出现的位置记录,将两个逗号中间的字符串拷贝到vector当中,如果到头了,则直接将最后一个字符串拷贝到vector当中,用sub到vector中寻找是否符合。
str.substr(),第一个参数是字符串起始位置,第二个是拷贝的长度,返回拷贝字符串
str.find(),第一个参数是要寻找的字符或字符串,第二个参数是寻找的起始位置,返回找到字符的起始位置
find(),第一第二个参数控制,寻找的范围(用迭代器),第三个参数是要寻找的字符串,返回值是迭代器,具体使用看代码
// write your code here cpp
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string str,sub;
while(getline(cin, str))
{
getline(cin, sub);
vector<string> arr;
for(int i = 0; i < str.size(); ++i)
{
//处理引号部分
if(str[i] == '\"')
{
//将引号中的名字存起来
arr.push_back(str.substr(i+1, str.find('\"', i+1)-1-i));
//从","下一位开始找
i = str.find('\"', i+1)+1;
}
//处理非引号部分
else
{
//如果没到头
if(str.find(',', i)!=string::npos)
{
arr.push_back(str.substr(i, str.find(',', i)-i));
i = str.find(',', i);
}
//如果到头了
else
{
arr.push_back(str.substr(i, str.size()-i));
i = str.size();
}
}
}
if(find(arr.begin(), arr.end(), sub)!=arr.end())
cout<<"Ignore"<<endl;
else
cout<<"Important!"<<endl;
}
return 0;
}
第二题-年会抽奖
思路:
// write your code here cpp
#include<iostream>
using namespace std;
int main ()
{
//用long long防止超出范围
long long mistake[21]={0,0,1};//都装错的次数
long long sum[21] = {1,1,2};//所有装的方法
for(int i = 3; i <= 20; ++i)
{
mistake[i] = (i-1)*(mistake[i-1]+mistake[i-2]);
sum[i] = sum[i-1]*i;
}
int n;
while(cin>>n)
{
printf("%.2lf%\n",100.0*mistake[n]/sum[n]);
}
}