1.学号问题
对于这道题而言,重要的是如何比较余数的问题,我们可以利用桶排法来进行
解题。
代码如下
#include<iostream>
#include<vector>
using namespace std;
/*
找到一个最小的数m,使得当前的数对m都不同余
我们可以利用桶排法的思想,如果那个余数存在那么就为1,
本来为0,如果下次继续碰到那么可以直接退出
*/
void main()
{
int m, n;
cin >> m;
bool find = true;
while (m--)
{
cin >> n;
vector<int> a;
for (int i = 0; i < n; i++)
{
int t;
cin >> t;
a.push_back(t);
}
for (int i = 1;; i++)
{
find = true;//注意保留原来的状态
vector<int> b(9999999, 0);
for (int j = 0; j < a.size(); j++)
{
if (b[a[j] % i])
{
find = false;
break;
}
b[a[j] % i] = 1;
}
if (find)
{
cout << i << endl;
break;
}
}
}
system("pause");
}
2.斐波那契数列对于被3整除的问题
问题的f0=7 f1=11;这个数字虽然现在比较小,但是可能到了后面会超出整数的
范围,那么我们应该进行预处理
例如f(n)=(f(n-1)%3+f(n-2)%3)%3;
代码如下
#include<iostream>
#include<vector>
using namespace std;
/*对于斐波那契数列的判断,由于当n的数字增大时我们可能超出
整数的范围,那么我们可以进行预处理
*/
vector<int> a(100000, 0);
void pr()
{
a[0] = 7;
a[1] = 11;
for (int i = 2; i < 100000; i++)
{
a[i] = (a[i - 1]%3 + a[i - 2]%3)%3;
}
a[0] = 7 % 3;
a[1] = 11 % 3;
}
void main()
{
int n = 0;
cin >> n;
if (!a[n])
{
cout << "yes" << endl;
}
else
{
cout << "no" << endl;
}
system("pause");
}
总结
- 对于桶排序的思想要理解,例如对于判断是否任意两个都不一样可以使用
- 对于数字最后可能比较大的情况下,注意要明白可以利用快速幂的思想