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; }
总结
主要锻炼了写代码中的基础能力。