7月15到7月21记录

(一)难题

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
InputcopyOutputcopy
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

InputcopyOutputcopy
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

InputcopyOutputcopy
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

InputcopyOutputcopy
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,要求按如下方式构造数列:

  1. 只有一个数字 n 的数列是一个合法的数列。
  2. 在一个合法的数列的末尾加入一个正整数,但是这个正整数不能超过该数列最后一项的一半,可以得到一个新的合法数列。

请你求出,一共有多少个合法的数列。两个合法数列 a,b 不同当且仅当两数列长度不同或存在一个正整数 i≤∣a∣,使得 ai​!=bi​。

Input

输入只有一行一个整数,表示 �n。

Output

输出一行一个整数,表示合法的数列个数。

Sample 1

InputcopyOutputcopy
6
6

样例 1 解释

满足条件的数列为:

  • 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一模一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值