题目1——01字符串
分析
经过拆解找规律,发现是两个斐波那契
那么代码就好写了呀
#include <stdio.h>unsigned long long f(int n){if(n==0||n==1){return n;}return (f(n-1)+f(n-2))%2333333;
}int main(){int n;scanf("%d",&n);printf("%lld",f(n)+f(n-1));
}
注意!斐波那契是加法操作,每次取余再加和先加再取余,其实都不影响的,因此直接返回取余的值没有问题!!
题目2——非素数个数
暴力解法,不多说
但是当达到10的7次量级,会超时
#include <cstdio>
#include <map>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;vector<int> store;bool is_su(int n){if(n==1||n==2||find(store.begin(),store.end(),n)!=store.end()){return true;}for(int i=2;i<=sqrt(n);i++){if(n%i==0){store.push_back(i);return false;}}return true;
}int main(){int a,b;while(scanf("%d%d",&a,&b)!=EOF){int counts = b-a+1;;for(int i=a;i<=b;i++){if(is_su(i)==true){counts--;}}printf("%d\n",counts);}return 0;
}
用算法,没学过可能很难做出来
埃拉托斯特尼筛法是一种用于找出一定范围内所有素数的算法:
1.首先,创建一个包含从2到所需范围内所有数字的列表。
2.从最小的素数2开始,将其标记为素数,并将其倍数(除了自身)标记为合数。
3.继续找到下一个未被标记的素数,将其标记为素数,并将其倍数标记为合数。
4.重复步骤3,直到找到的素数的平方大于所需范围的最大值。
5.最后,未被标记为合数的数字即为素数。
#include <iostream>
using namespace std;
const int N = 1e7 + 10;int a, b, cnt;
int primes[N];
bool st[N];int get_primes(int x)
{for (int i = 2; i <= x; i ++ ){if (!st[i]) primes[cnt ++] = i;for (int j = 0; primes[j] <= x / i; j ++ ){st[primes[j] * i] = true;if (i % primes[j] == 0) break;}}
}int main()
{get_primes(N);while (cin >> a >> b){int res = 0;for (int i = a; i <= b; i ++ ) if (st[i]) res ++;cout << res << endl;}return 0;
}