裴波那切数列
7-1 The Closest Fibonacci Number (20 分)
#include<bits/stdc++.h>
using namespace std;
int num[1002]={0,1};
int cnt=2;
int main()
{
int n;
cin>>n; //读入一个n
while(1) //死循环
{
num[cnt]=num[cnt-1]+num[cnt-2]; //num表示裴波那切数列的打表
if(num[cnt++]>100000000) break;
}
int min=999999999,flag;
for(int i =cnt-1;i>=0;i--) //从后往前进行遍历
{
if(abs(n-num[i])<=min) //找到与目标数字n 最接近的数,并且是最小的
{
flag=i;
min=abs(n-num[i]);
}
}
cout << num[flag];
return 0;
}
筛素数
7-1 Arithmetic Progression of Primes (20 分)
#include <iostream>
using namespace std;
const int N = 1e5 + 10, M = 20;
int n, m;
int primes[N], cnt;
bool st[N];
int res[M], d;
//筛素数表
void get_primes(int n) {
st[0] = st[1] = true;
for (int i = 2; i <= n; ++i) {
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= n / i; ++j) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
int main()
{
cin >> n >> m;
get_primes(m);
//特判1,避免除0
if (n != 1)
{
for (int i = 0; i < cnt; i++)
{
//a是首项
const int &a = primes[i];
//从大到小枚举等差
for (int j = (m - a) / (n - 1); j > 1; j--)
{
//枚举每一项,看看是否是质数
bool legal = true;
for (int k = 1; k < n; k++)
{
int x = a + j * k;
//如果不是质数,则放弃该方案
if (st[x])
{
legal = false;
break;
}
}
//如果找到了一组等差数组,那么以i开始的最优解就找到了,直接break
if (legal)
{
//(1)如果i的最优解的等差j > 当前存储的答案d,则更新res和d
//(2)如果j == d,则当前以i开头的数列首项i必然是大于res中存储的首项res[0]的,我们也选择更新答案
if (j >= d)
{
for (int k = 0; k < n; ++k)
res[k] = a + j * k;
d = j;
}
break;
}
}
}
}
//输出答案
if (d)
{
for (int i = 0; i < n; i++)
{
if (i)
cout << " ";
cout << res[i];
}
}
else
{
for (int i = m; i; i--)
{
if (!st[i])
{
cout << i << endl;
break;
}
}
}
return 0;
}
晒法求素数
#include<iostream>
using namespace std;
bool prime(int x)
{
if(x<=1)
return false;
for(int i=2; i*i<=x; i++)
if(x%i==0)
return false;
return true;
}
int main()
{
int n,m;
cin >> n >> m;
string s;
cin >> s;
bool flag=false;
for(int i=0; i+m<=n; i++)
{
string temp=s.substr(i,m);
int num=stoi(temp);
if(prime(num))
{
cout << temp;
flag=true;
break;
}
}
if(!flag)
cout << 404;
return 0;
}