第一题:
1、2、3.。。。n盏灯,同时有n个人,
第1个人将1的倍数的灯拉一下,
第2个人将2的倍数的灯拉一下,
......
问最后有几盏灯是亮的,
初始状态下灯是灭的,
输入整数n(n<65536),
输出亮的灯数
方法解析:设置一个map,关键字为灯的编号,值为0或1,分别表示灯灭和灯亮状态,遍历map,第i个灯,将所有i倍数的灯进行一次取反操作,也可以通过数组实现。代码如下:
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int count1(int n)
{
vector<int> vec(65536, 0);
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n;j++)
{
if (j%i== 0)
vec[j - 1] = !vec[j - 1];;
}
}
int sum = 0;
for (int j = 0; j < n; j++)
{
if (vec[j] != 0) //统计灯泡亮着的个数
sum++;
}
return sum;
}
int count2(int n)
{
map<int, int> m;
for (int i = 1; i <= n; i++) //初始化map
m.insert({ i, 0 });
for (int j = 1; j <= n; j++)
{
for (auto it = m.begin(); it != m.end(); it++)
{
if (it->first%j == 0)
it->second = !(it->second);
}
}
int sum = 0;
for (auto it = m.begin(); it != m.end(); it++)
if (it->second == 1)
sum++;
return sum;
}
int count3(int n)
{
int sum = 0;
bool a[65536] = { 0 };
for (int i = 1; i <= n; i++) //通过两嵌套循环模拟N个人一次拉灯
{
for (int j = 1; j <= n; j++)
{
if (j % i == 0)
{
a[j - 1] = !a[j - 1];
}
}
}
for (int j = 0; j < n; j++)
{
if (a[j] != 0) //统计灯泡亮着的个数
sum++;
}
return sum;
}
int _tmain(int argc, _TCHAR* argv[])
{
int number1 = count1(100);
cout << number1 << endl;
return 0;
}
第二题:
输入整数(n是小于9位数的整数),当作字符串处理,看是否有相同的子串,如1212,相同子串是12,141516没有子串(子串必须大于等于2),若有相同子串则输出1,否则输出0,
输入:长度小于9的整数
输出:1或0
方法解析:一开始考虑这道题时大脑短路,老是把长度为2、3、4的子串情况单独考虑,后来才想到只要保证有长度为2的子串相同即可。另外,对于string类型的成员函数substr()参数有些遗忘,这个函数的两个参数分别表示子串的起始位置和子串长度。实现代码如下:
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int fun1(string &s) //方法一:用字符数组来解决
{
int i = 0, j;
int res = 0;
for (i = 2; i < s.size() - 1; i++)
{
for (j = i - 1; j >= 0; j--)
{
if (s[i] == s[j] && s[i + 1] == s[j + 1])
{
res = 1;
break;
}
}
if (res == 1)
break;
}
return res;
}
int fun2(string &s) //方法二:用string类型的子串来判断
{
int flag = 0;
for (int i = 0; i < s.size()-1; i++)
{
for (int j = i + 2; j < s.size()-1; j++)
{
if (s.substr(i,2) == s.substr(j,2))
{
flag = 1;
break;
}
if (flag)
break;
}
}
return flag;
}
int _tmain(int argc, _TCHAR* argv[])
{
string s = "13214121";
cout <<fun1(s) << endl;
cout<<fun2(s)<<endl;
return 0;
}