(一)难题
A- 哥德巴赫猜想
Description
输入一个偶数 N,验证 4∼𝑁所有偶数是否符合哥德巴赫猜想:任一大于 22 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+51则 10=5+5是错误答案。
Input
第一行输入一个正偶数 𝑁N
Output
输出 𝑁−222N−2 行。对于第 𝑖i 行:
首先先输出正偶数 2𝑖+22i+2,然后输出等号,再输出加和为 2𝑖+22i+2 且第一个加数最小的两个质数,以加号隔开。
Sample
Sample 1
Inputcopy | Outputcopy |
---|---|
10 | 4=2+2 6=3+3 8=3+5 10=3+7 |
详解
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int x){
if(x<2) return false;
for(int i=2;i<=x/i;i++) {
if(x%i==0) return false;
}
return true;
}
int main()
{
int N,n[10000]={2,3},con=0,m=0;
cin>>N;
for(int i=4;i<=N;i+=2){
int f=1;
for(int j=2;j<i;j++){
if(f==1){
if(isPrime(j)&&isPrime(i-j)){
cout<<i<<'='<<j<<'+'<<i-j<<endl;
f=0;
}
}
}
} //判断
}
Copy
C++
思路步骤
1.输出的数均为质数且和为i
if(isPrime(j)&&isPrime(i-j)
2.确保符合条件就终止
3.判断素数
个人问题(上榜原因)
1.可以用continue
2.false与true 有输错情况。
B- 最大质因子序列
Description
任意输入两个正整数 𝑚,𝑛m,n(2≤𝑚≤𝑛≤50002≤m≤n≤5000),依次输出 𝑚m 到 𝑛n 之间每个数的最大质因子(包括 𝑚m 和 𝑛n;如果某个数本身是质数,则输出这个数自身)。
Input
一行,包含两个正整数 𝑚m 和 𝑛n,其间以单个空格间隔。
Output
一行,每个整数的最大质因子,以逗号间隔。
Sample 1
Inputcopy | Outputcopy |
---|---|
5 10 | 5,3,7,2,3,5 |
详解
#include<bits/stdc++.h>
using namespace std;
bool is_prime(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
return false;
return true;
}
int main()
{
int m,n;
cin>>m>>n;
for(int i=m;i<=n;i++){
for(int j=i; j>=2; j--){
if((i%j==0) && is_prime(j))
{
cout<<j;
if(i!=n)
cout<<",";
break;
}
}
}
printf("\n");
return 0;
}
思路步骤
1.从末尾(本身)开始求最大因数
2.本身为素数,直接输出。
(i%j==0)
3.判断
4.除末尾数+","
个人问题(上榜原因)
1.原先从2开始迭代导致卡题。
2.同时判断整除与素数。
C- 汉诺塔
Description
约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。
这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。
假定圆盘从小到大编号为1, 2, ...
Input
输入为一个整数后面跟三个单字符字符串。
整数为盘子的数目,后三个字符表示三个杆子的编号。
Output
输出每一步移动盘子的记录。一次移动一行。
每次
Sample
Inputcopy | Outputcopy |
---|---|
2 a b c | a->1->c a->2->b c->1->b |
移动的记录为例如 a->3->b 的形式,即把编号为3的盘子从a杆移至b杆。
详解
#include<bits/stdc++.h>
using namespace std;
void hanoi(int n,char a,char b,char c){
if(n==0) return;
hanoi(n-1,a,c,b);
printf("%c->%d->%c\n",a,n,b);
hanoi(n-1,c,b,a);
}
int main(){
int n;
char a,b,c;
cin>>n>>a>>b>>c;
hanoi(n,a,b,c);
}
思路步骤
所有汉诺塔(N个)可以简化为两个即
1.上面N-1个从起始柱移动到中间柱;
2.最下面移到目标柱;
3.N-1移到目标柱;
4.如果N-1>1,重复1-3.
个人问题(上榜原因)
1.期末未解决。
2.开始时没调整中间柱编号。
D-赦免战俘
Description
现有 2^n×2^n(n≤10) 名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。
给出 n,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。
Input
一个整数 n。
Output
2^n×2^n 的 01 矩阵,代表每个人是否被赦免。数字之间有一个空格。
Sample 1
Inputcopy | Outputcopy |
---|---|
3 | 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 |
详解
#include<bits/stdc++.h>
using namespace std;
int h[1025][1025]={0};
void f(int m,int a,int b){
if(m==2) {
h[a][b]=0;
}
else {
for(int i=a;i<a+m/2;i++){
for(int j=b;j<b+m/2;j++){
h[i][j]=0;
}
}
f(m/2,a+m/2,b+m/2);
f(m/2,a,b+m/2);
f(m/2,a+m/2,b);
}
}
int main(){
int n;
cin>>n;
int m=pow(2,n);
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
h[i][j]=1;
}
}
int x=0,y=0;
f(m,x,y);
for(int i=0;i<m;i++){
for(int j=0;j<m;j++){
printf("%d ",h[i][j]);
}
printf("\n");
}
}
思路步骤
1.必须选择赋值“1”,再通过循环改为0;
2.到2^2 大小(m==2)后结束递归。
3.左上1/4赋0;
4.剩下3个1/4递归。
个人问题(上榜原因)
1.开始函数性质不是void,对函数void不熟(已看博客)。
2.三个递归就行了多次修改,充分体现了我的递归思路中的盲区。
E-数的计算
Description
给出正整数 n,要求按如下方式构造数列:
- 只有一个数字 n 的数列是一个合法的数列。
- 在一个合法的数列的末尾加入一个正整数,但是这个正整数不能超过该数列最后一项的一半,可以得到一个新的合法数列。
请你求出,一共有多少个合法的数列。两个合法数列 a,b 不同当且仅当两数列长度不同或存在一个正整数 i≤∣a∣,使得 ai!=bi。
Input
输入只有一行一个整数,表示 �n。
Output
输出一行一个整数,表示合法的数列个数。
Sample 1
Inputcopy | Outputcopy |
---|---|
6 | 6 |
样例 1 解释
满足条件的数列为:
- 6
- 6,1
- 6,2
- 6,3
- 6,2,1
- 6,3,1
数据规模与约定 对于全部的测试点,保证1≤n≤10^3。
详解
#include<bits/stdc++.h>
using namespace std;
int h[10090000];
int main(){
int n;
cin>>n;
h[1]=1;
for(int i=2;i<=n;i++){
h[i]=h[i-1];
if(i%2==0)
h[i]=h[i-1]+h[i/2];
}
cout<<h[n];
}
思路步骤
1.参考兔子数列,将每个数的情况进行记录。
2.奇数与(n-1)相同。
3,偶数+n/2情况,即6的6,3,1与6,3这2个与3的数目相同。
个人问题(上榜原因)
1.经典的递归转迭代。
2.与周考的F-Equation一模一样。