【入门1】顺序结构

P1008 [NOIP1998 普及组] 三连击
https://www.luogu.com.cn/problem/P1008
模拟,枚举所有可能的a,输出满足条件的a,b,c。

#include <bits/stdc++.h>

using namespace std;

int main(){
    int v;
    bool a[10];//ai表示第i个数已经用过了
    for(int i = 123; i < 329; i++){
        memset(a, 0, sizeof(a));
        v = 0;
        a[i % 10] = a[i / 10 % 10] = a[i / 100] = 1;
        a[i * 2 % 10] = a[i * 2 / 10 % 10] = a[i * 2 / 100] = 1;
        a[i * 3 % 10] = a[i * 3 / 10 % 10] = a[i * 3 / 100] = 1;//统计数字
        for(int j = 1; j <= 9; j++) v += a[j]; //v表示1-9这些数字是否全部齐了
        if(v == 9) printf("%d %d %d\n", i, i * 2, i * 3);//如果齐了就输出
    }
    return 0;
}

【入门2】分支结构

P5717 【深基3.习8】三角形分类
https://www.luogu.com.cn/problem/P5717
在一个三角形中,如果较短的两条边的平方和大于最长边的平方,那么这个三角形是锐角三角形,否则它是钝角三角形。

if(a[0] * a[0] + a[1] * a[1] > a[2] * a[2]) printf("Acute triangle\n"); 
        if(a[0] * a[0] + a[1] * a[1] < a[2] * a[2]) printf("Obtuse triangle\n"); 

【入门3】循环结构

P1009 [NOIP1998 普及组] 阶乘之和
https://www.luogu.com.cn/problem/P1009
50!非常大,需要用高精度数。
图片说明
这里编译要用c++11,不然用c++会报错"错误:在 C++98 中‘sum’必须由构造函数而不是‘{...}’初始化
vector<int> sum = {0};"</int>

#include <bits/stdc++.h>

using namespace std; 
typedef pair<int, int> PII;
const int N = 1e6 + 10;

vector<int> add(vector<int> &A, vector<int> &B){
    if(A.size() < B.size()) return add(B, A);
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size(); i++){
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
    if(t > 0) C.push_back(t);
    return C;
}

vector<int> mul(vector<int> &A, int b){
    vector<int> C;
    int t = 0;
    for(int i = 0; i < A.size() || t; i++){
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

int main(){
    int n;
    cin >> n;
    vector<int> sum = {0};
    vector<int> t = {1};
    for(int i = 1; i <= n; i++){
        t = mul(t, i);
        sum = add(sum, t);
    }

    for(int i = sum.size() - 1; i >= 0; i--) printf("%d", sum[i]);
    return 0;
}

P1217 [USACO1.5]回文质数 Prime Palindromes
https://www.luogu.com.cn/problem/P1217
1.偶数位数回文数(除11)必定不是质数(自行百度),所以只要运行到10000000。2.偶数肯定不是质数。这样至少排除一半多的数据量。3,你回文数已经判断出来了,在此中判断即可。

#include <bits/stdc++.h>
using namespace std; 

bool is_hw(int x){
    int tmp = x, reverse = 0;
    while(tmp){
        reverse = reverse * 10 + tmp % 10;
        tmp /= 10;
    }
    return x == reverse;
}

bool is_prime(int x){
    for(int i = 2; i <= x / i; i++){
        if(x % i == 0) return false;
    }
    return true;
}

int main(){
    int a, b;
    cin >> a >> b;
    if(a % 2 == 0) a++; //偶数一定不是质数 
    for(int i = a; i <= b; i += 2){
        if(i > 10000000) break;
        if(is_hw(i)){
            if(is_prime(i)) cout << i << endl;
        }
    } 
    return 0;
}

【入门4】数组

P5731 【深基5.习6】蛇形方阵
https://www.luogu.com.cn/problem/P5731
注意每个数字有都会占用 3 个字符,前面使用空格补齐。
用 printf("%3d",a[i][j]);
%3d 表示输出3位整型数, 不够3位右对齐。%2d 表示输出2位整型数, 不够2位右对齐。

#include <bits/stdc++.h>

using namespace std; 
typedef long long LL;
const int N = 10;

int a[N][N];
//绕着走的四个方向,右、下、左、上(要按顺序) 
int dir[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
定义一个改变位置的数组,还有一个变量记录现在头朝哪边。如果越界或以前填过,就改变方向。
int main(){
    int n;
    cin >> n;
    int x = 1, y = 1, d = 0;
    for(int i = 1; i <= n * n; i++){
        a[x][y] = i;
        int tx = x + dir[d][0], ty = y + dir[d][1];
        if(tx < 1 || tx > n || ty < 1 || ty > n || a[tx][ty] != 0)
            d = (d + 1) % 4;
        x = x + dir[d][0], y = y + dir[d][1];
    }

    for(int i = 1; i <= n; i++){//按题意输出 
        for(int j = 1; j <= n; j++){
            printf("%3d", a[i][j]);
        }
        cout << endl;
    }
    //printf("%d\n", key); 
    return 0;
}

P1205 [USACO1.2]方块转换 Transformations
https://www.luogu.com.cn/problem/P1205
是比较复杂的模拟,需要仔细考虑,不要粗心写错了。

#include <bits/stdc++.h>

using namespace std; 
typedef long long LL;
const int N = 20;

struct Matrix{
    int map[12][12];
    int n;
}from, to;

//Right 90
bool t1(const Matrix& in){
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<=in.n;j++){
            if(in.map[i][j]!=to.map[j][in.n-i+1]) return 0;
        }
    }
    return 1;
}

//Right 180
bool t2(const Matrix& in){
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<=in.n;j++){
            if(in.map[i][j]!=to.map[in.n-i+1][in.n-j+1]) return 0;
        }
    }
    return 1;
}
//Right 270
bool t3(const Matrix& in){
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<=in.n;j++){
            if(in.map[i][j]!=to.map[in.n-j+1][i]) return 0;
        }
    }
    return 1;
}
//Reflect
bool t4(const Matrix& in){
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<=in.n;j++){
            if(in.map[i][j]!=to.map[i][in.n-j+1]) return 0;
        }
    }
    return 1;
}

bool t5(const Matrix& in){
    Matrix tmp;tmp.n=in.n;
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<=in.n;j++){
            tmp.map[i][j]=in.map[i][in.n-j+1];
        }
    }
    return (t1(tmp)||t2(tmp)||t3(tmp));
}

bool t6(const Matrix& in){
    for(int i=1;i<=in.n;i++){
        for(int j=1;j<in.n;j++){
            if(in.map[i][j]!=to.map[i][j]) return 0;
        }
    }
    return 1;
}

int main(){
    scanf("%d",&from.n); to.n=from.n; 
    string tmp;
    getline(cin,tmp);
    for(int i=1;i<=from.n;i++){
        getline(cin,tmp);
        for(int j=0;j<from.n;j++) from.map[i][j+1]=tmp[j];
    }
    for(int i=1;i<=to.n;i++){
        getline(cin,tmp);
        for(int j=0;j<to.n;j++) to.map[i][j+1]=tmp[j];
    }
    if(t1(from) == 1){
        printf("1"); 
        exit(0);
    }
    if(t2(from) == 1){
        printf("2"); 
        exit(0);
    }
    if(t3(from) == 1){
        printf("3"); 
        exit(0);
    }
    if(t4(from) == 1){
        printf("4"); 
        exit(0);
    }
    if(t5(from) == 1){
        printf("5"); 
        exit(0);
    }
    if(t6(from) == 1){
        printf("6"); 
        exit(0);
    }
    printf("7");
    return 0;
}

【入门5】字符串

#include <cctype>

这是一个拥有许多字符串处理函数声明的头文件,这些函数可以用来对单独字符串进行分类和转换;

例如:

isalpha():检查这个字符是否为字母,真返回1,假返回0;

isalnum():检查这个字符是否为字母或数字数字,同上;

isdigit():检查这个字符是否为十进制数字,同上;

islower():检查这个字符是否为小写字母,同上;

字符串操作
https://www.cnblogs.com/komean/p/11109555.html
https://www.luogu.com.cn/problem/P1308
P1308 [NOIP2011 普及组] 统计单词数

https://www.luogu.com.cn/problem/solution/P1308

注意有可能以空格开头!
改了好久终于没有bug了。

#include <bits/stdc++.h>

using namespace std; 
typedef long long LL;
const int N = 20;

string to_lower(string s){
    for(int i = 0; i < s.size(); i++)
        if(isupper(s[i])) s[i] = s[i] - 'A' + 'a';
    return s;
}

int main(){
    int ans = 0, pos = -1;
    bool flag = false;//判断是否找到
    string w, s;
    getline(cin, w);
    w = to_lower(w);
    getline(cin, s);
    if(s[s.length() - 1] != ' ') s += ' ';
    int p = 0;
    string tmp = "";
    while(p < s.size()){
        if(s[p] != ' ') {
            if(isupper(s[p])) s[p] = s[p] - 'A' + 'a';
            tmp += s[p];
            p++;
        }
        else{
            if(tmp == w){
                ans++;
                if(flag == false){
                    flag = true;
                    pos = p - tmp.size();
                }
            }
            tmp = "";
            p++;
        }
    }
    if(flag) printf("%d %d\n", ans, pos);
    else printf("%d\n", pos);
    return 0;
}

P1603 斯诺登的密码
https://www.luogu.com.cn/problem/P1200

#include <bits/stdc++.h>

using namespace std; 
typedef long long LL;
const int N = 20;

char dic[30][20]={"zero","one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty","a","both","another","first","second","third"};
int di[30]={0,1,4,9,16,25,36,49,64,81,00,21,44,69,96,25,56,89,24,61,0,1,4,1,1,4,9};
char s[100];
unsigned long long int a[10], top, flag;

int main(){
    for(int i = 0; i < 6; i++){
        cin >> s;
        for(int j = 1; j <= 26; j++){
            if(!strcmp(s, dic[j])){
                a[++top] = di[j];
                break;
            }
        }
    }
    sort(a + 1, a + top + 1);
    for(int i = 1; i <= top; i++){
        if(flag){
            printf("%.2d", a[i]);
        }
        else{
            if(a[i]){ 
                printf("%d",a[i]);
                flag = 1;
            }
        }
     }
     if(!flag) printf("0");
    //printf("%d\n%d\n", boy, girl);
    return 0;
}

【入门6】函数与结构体

P1304 哥德巴赫猜想
https://www.luogu.com.cn/problem/P1304
自己很快写出来的,记录一下

#include <bits/stdc++.h>

using namespace std; 
typedef pair<string, string> PSS;
const int N = 10010;

int prime[N], cnt;
int st[N]; 

void get_prime(){
    for(int i = 2; i <= N; i++){
        if(!st[i]) prime[cnt++] = i;
        for(int j = 0; prime[j] <= N / i; j++){
            st[prime[j] * i] = 1;
            if(i % prime[j] == 0) break;
        }
    }
}

int main(){
    int n;
    cin >> n;
    get_prime();
    for(int i = 4; i <= n; i += 2) {
        for(int j = 0; j < cnt; j++){
            if(st[i - prime[j]] == 0){
                cout << i << "=" << prime[j] << "+" << i - prime[j] << endl;
                break;
            }
        }
    }
    //printf("%d\n", cnt); 
    return 0;
}

P2415 集合求和
https://www.luogu.com.cn/problem/P2415
涉及排列组合计算。
图片说明