2023.7.30周报

c++万能开头文件
#include<bits/stdc++.h>

质数筛
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
bool isprime(int x){
    if(x<=1) return false;
    for(int i=2;i<=sqrt(x);i++){
        if(x%i==0) return false;
    }
    return true;
}
int main(){
    int n,a;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a;
        if(isprime(a)){
            cout<<a<<" ";
        }
    }
    return 0;
}
//上方质数筛选较慢且使用了sqrt函数
bool isprime(int x){
    if(x <= 1) return false;
    if(x == 2 || x == 3) return true;
    if(x % 6 != 1 && x % 6 != 5) return false;
    //除2,3以外所有质数都必须是6x+1或6x+5,6x+2,6x+3,6x+4都有除了自身以外的因素。
    for(int i = 5 ; i * i < x ; i += 6){
        if(x % i == 0 || x % (i + 2) == 0) return false;
    }
    return true;
}
//快了三倍

赦免战俘

现有 2^n×2^n(n≤10)名作弊者站成一个正方形方阵等候 kkksc03 的发落。kkksc03 决定赦免一些作弊者。他将正方形矩阵均分为 4 个更小的正方形矩阵,每个更小的矩阵的边长是原矩阵的一半。其中左上角那一个矩阵的所有作弊者都将得到赦免,剩下 3 个小矩阵中,每一个矩阵继续分为 4 个更小的矩阵,然后通过同样的方式赦免作弊者……直到矩阵无法再分下去为止。所有没有被赦免的作弊者都将被处以棕名处罚。

给出 n,请输出每名作弊者的命运,其中 0 代表被赦免,1 代表不被赦免。

输入样例

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

类似于杨辉三角

将杨辉三角中的数%2得可到类似的输出样例

#include<bits/stdc++.h>
using namespace std;
#define maxn 100010
int yanghui[2][maxn],n;
int main()
{ 
    scanf("%d",&n);
    memset(yanghui , 0 , sizeof(yanghui));
    n = pow(2 , n);
    for(int i = 1 ; i <= n ; i++)
    {
        for(int j = n-i ; j >= 1 ; j--)
            printf("0 ");
        int k = i % 2;
        yanghui[k][i] = 1;
        for(int j = 1 ; j < i ; j++)
            yanghui[k][j] = yanghui[!k][j]+yanghui[!k][j - 1];
        for(int j = 1 ; j <= i ; j++){
            if(yanghui[k][j] % 2){
                printf("1");
            }else{
                printf("0");
            }
            printf(" ");
        }
        printf("\n");
    }
    return 0; 
} 

(还没看懂的题解)

每一个数字都是它上方数字加上右上方数字再模2。

其实就是不进位加法,异或一下就好了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define QWQ cout<<"QwQ"<<endl;
#define ll long long 
#include<vector>
#include<queue>
#include<stack>
#include<map>
#define re register
using namespace std;
const int N=101010;
const int qwq=303030;
const int inf=0x3f3f3f3f;
int n;
int a[1234][1234];
int main()
{
    scanf("%d",&n);
    n = (1<<n);
    a[0][n+1] = 1;
    for(re int i=1;i<=n;++i)
    {
        for(re int j=1;j<=n;++j)
        {
            a[i][j] = a[i-1][j] ^ a[i-1][j+1];
            printf("%d ",a[i][j]);
        }
        printf("\n");
    }
    return 0;
}

集合求和

给定一个集合 s(集合元素数量 ≤30),求出此集合所有子集元素之和。

输入样例

2 3

输出样例

10

说明/提示

【样例解释】

子集为:∅,{2},{3},{2,3}∅,{2},{3},{2,3},和为 2+3+2+3=102+3+2+3=10。

通过找规律可知集合中的每个数都有2^(n-1)次的机会被选中

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a[31] = {0} , i = 0 ;
    long long sum = 0 ;
    while(cin >> a[i++]){//== cin >> a[i] ; i++ ;
        sum += a[i - 1];
    }
    sum *= pow(2, i - 2);
    cout << sum ;
    return 0;
}

回文质数

错误原因基本为超时

#include<bits/stdc++.h>
bool check1(int k);
bool check2(int k);
bool check3(int k);
int main(){
    int n,m;
    scanf ("%d %d", &n, &m);
    if (n % 2 ==0) n++;
    if (m > 9999999) m = 9999999;//9999999以后的数不再存在回文质数
    for (int i = n; i <= m; i+=2){//i+=2加速判断质数
        if (check1(i)) continue;
        if (check2(i)) continue;
        if (check3(i)) continue;
        printf ("%d\n", i);
    }
    return 0;
}
bool check1(int k){//判断回文
    int a[10], p = 0;
    while (k != 0){
        a[p] = k % 10;
        k = k / 10;
        p ++;
    }
    for (int j = 0; j <= p / 2; j++){
        if (a[j] != a[p - j - 1]){
            return true;
        }
    }
    return false;
}
bool check2(int k){//4位数和6位数的数不可能回文质数
    if ((k >= 1000 && k < 10000) || (k >= 100000 && k < 1000000)){
        return true;
    }
    return false;
}
bool check3(int k){//判断质数
    if(k == 2) return false;
    for(int i = 2; i <= sqrt(k); i++)
        if(k % i == 0) return true;
    return false;
}

总结

主要锻炼了写代码中的基础能力。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值