1、求所有能被7整除的数字
分析:
方法一:采用暴力解法,即两两数字都组合一遍对7取余判断的方法,算法复杂度O(n2),会超时,提交成功率为70%。
方法二:求一个数A前面拼接上什么数能够被7整除,只需进行以下操作即可:
①数A前面依次拼上0~6,变为0A,1A,2A···6A。
②依次判断这7个数能否被7整除
②以1A为例,若1A等被7整除,则A前面拼的数B,只要满足B%7==1,则BA能被7整除,因为B%7==1,所以BA总能转化为1A,即BA也能被7整除。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxN = 100001;
int a[maxN];
int sum[7];//记录余数0-6的数的个数
int getlen(int x)//求一个数的长度
{
if (x == 0) return 1;
int ans = 0;
while (x>0)
{
x /= 10;
ans++;
}
return ans;
}
long long fuck(int x, int y)//将数x乘上10的y次方,为了连接两个数用
{
long long ans = x;
while (y--)
{
ans *= 10;
}
return ans;
}
int main()
{
int n;
while (cin >> n)
{
int totalNum = 0;
memset(sum, 0, sizeof(sum));
for (int i = 0; i < n; i++)
{
cin >> a[i];
sum[a[i] % 7]++;
}
for (int i = 0; i < n; i++)
{
sum[a[i] % 7]--;
for (int j = 0; j < 7; j++)//此方法的精髓所在,分析见上文
{
long long num = fuck(j, getlen(a[i])) + a[i];
if (num % 7 == 0)
{
totalNum += sum[j];
}
}
sum[a[i] % 7]++;
}
cout << totalNum << endl;
}
}
2、点灯泡比赛
这道题还没有理清楚,做的时候写了几个案例发现最后一个灯泡如果为‘1’则Alice赢,为‘0’则Bob赢,尝试了下就AC了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int flag;
vector<int> v;
while (cin >> n)
{
for (int i = 0; i < n; i++)
{
cin >> flag;
v.push_back(flag);
}
if (v[n - 1] == 1)
cout << "Alice" << endl;
else
cout << "Bob" << endl;
}
}