基础训练汇总

Posted 揭航

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础训练汇总相关的知识,希望对你有一定的参考价值。

基础训练汇总

基础

01_闰年判断

B_约数C_连在一起的长度C_连在一起的长度 /*

 问题描述
 给定一个年份,判断这一年是不是闰年。

 当以下情况之一满足时,这一年是闰年:

 1. 年份是4的倍数而不是100的倍数;

 2. 年份是400的倍数。

 其他的年份都不是闰年。

 输入格式
 输入包含一个整数y,表示当前的年份。

 输出格式
 输出一行,如果给定的年份是闰年,则输出yes,否则输出no。
 说明:当试题指定你输出一个字符串作为结果(比如本题的yes或者no,你需要严格按照试题中给定的大小写,写错大小写将不得分。

 样例输入
 2013
 样例输出
 no
 样例输入
 2016
 样例输出
 yes
 数据规模与约定
 1990 <= y <= 2050。

 */


#include <cstdio>
#include <iostream>
using namespace std;

void f(int year) {
    int flag = 0;
    if (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
        cout << "yes";
    else
        cout << "no";
}
int main() {
    int year;
    cin >> year;
    f(year);
    return 0;
}

04_ 数列特征_最值_求和

/*
问题描述
给出n个数,找出这n个数的最大值,最小值,和。

输入格式
第一行为整数n,表示数的个数。

第二行有n个数,为给定的n个数,每个数的绝对值都小于10000。

输出格式
输出三行,每行一个整数。第一行表示这些数中的最大值,第二行表示这些数中的最小值,第三行表示这些数的和。
样例输入
5
1 3 -2 4 5
样例输出
5
-2
11
数据规模与约定
1 <= n <= 10000。
*/


#include <iostream>
using namespace std;
int main() {
    // 几个数?
    int n;
    int a[10000];
    // 最值
    int max = 0, min = 0;
    // 求和
    int sum = 0;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];

    // 别忘记一个数....
    max = a[0];
    min = a[0];

    for (int i = 0; i < n; i++) {
        // 比一次就行
        if (a[i] >= max) max = a[i];
        if (a[i] <= min) min = a[i];
        
        sum = sum + a[i];
    }
    cout << max << '\\n' << min << '\\n' << sum << endl;
    return 0;
}

07_水仙花数

/*
问题描述
  153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
输出格式
  按从小到大的顺序输出满足条件的三位十进制数,每个数占一行。
*/


#include <math.h>

#include <iostream>
using namespace std;
int main() {
    int gewei, shiwei, baiwei;
    for (int i = 100; i < 1000; i++) {
        baiwei = i / 100 % 10;
        shiwei = i / 10 % 10;
        gewei = i % 10;
        if (pow(baiwei, 3) + pow(shiwei, 3) + pow(gewei, 3) == i)
            cout << i << endl;
    }
    return 0;
}

08_回文数

/*
问题描述
  1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
输出格式
  按从小到大的顺序输出满足条件的四位十进制数。
*/


#include <math.h>

#include <iostream>
using namespace std;
int main() {
    int qianwei, baiwei, shiwei, gewei;
    for (int i = 1000; i < 10000; i++) {
        qianwei = i / 1000 % 10;
        baiwei = i / 100 % 10;
        shiwei = i / 10 % 10;
        gewei = i % 10;
        if (qianwei == gewei && baiwei == shiwei) cout << i << endl;
    }
    return 0;
}

09_特殊回文数

/*
问题描述
  123321是一个非常特殊的数,它从左边读和从右边读是一样的。
  输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n
。 输入格式   输入一行,包含一个正整数n。 输出格式
  按从小到大的顺序输出满足条件的整数,每个整数占一行。
样例输入
52
样例输出
899998
989989
998899
数据规模和约定
  1<=n<=54。
*/

#include <iostream>
using namespace std;
int main() {
    // 每位的数之和
    long long n;
    // 开够6位数的数组
    long long a[6];
    cin >> n;
    // 5位数的
    for (long long i = 10000; i < 100000; i++) {
        a[0] = i / 10000 % 10;
        a[1] = i / 1000 % 10;
        a[2] = i / 100 % 10;
        a[3] = i / 10 % 10;
        a[4] = i % 10;
        if (a[0] == a[4] && a[1] == a[3]) {
            if ((a[0] + a[1] + a[2] + a[3] + a[4]) == n
                cout << i << endl;
        }
        // 6位数的
        for (long long i = 100000; i < 1000000; i++) {
            a[0] = i / 100000 % 10;
            a[1] = i / 10000 % 10;
            a[2] = i / 1000 % 10;
            a[3] = i / 100 % 10;
            a[4] = i / 10 % 10;
            a[5] = i % 10;
            if (a[0] == a[5] && a[1] == a[4] && a[2] == a[3]) {
                if ((a[0] + a[1] + a[2] + a[3] + a[4] + a[5]) == n)
                    cout << i << endl;
            }
        }
        return 0;
    }
}

13_数列排序

/*
问题描述
  给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200
输入格式
  第一行为一个整数n。
  第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。
输出格式
  输出一行,按从小到大的顺序输出排序后的数列。
样例输入
5
8 3 6 4 9
样例输出
3 4 6 8 9
*/


#include <iostream>

using namespace std;
int main() {
    // 数组大小
    int n;
    int a[200];
    int temp;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < n - 1; i++) {
        // 后面的循环条件是减去i
        for (int j = i + 1; j < n; j++) {
            if (a[i] > a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    for (int i = 0; i < n; i++) cout << a[i] << " ";
    return 0;
}

查找与排序

05_查找整数


/*
问题描述
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。

输入格式
第一行包含一个整数n。

第二行包含n个非负整数,为给定的数列,数列中的每个数都不大于10000。

第三行包含一个整数a,为待查找的数。

输出格式
如果a在数列中出现了,输出它第一次出现的位置(位置从1开始编号),否则输出-1。
样例输入
6
1 9 4 8 3 9
9
样例输出
2
数据规模与约定
1 <= n <= 1000。
*/

#include <iostream>
using namespace std;
int main() {
    // n个整数
    int n;
    int a[1000];
    // 用于查找的数
    int lookNum;
    // 返回的下标
    int index = -1;
    cin >> n;
    for (int i = 0; i < n; i++) cin >> a[i];
    
    cin >> lookNum;
    for (int i = 0; i < n; i++) {
        if (lookNum == a[i]) {
            index = i + 1;
            break;
        }
    }
    cout << index;
    return 0;
}

数据转换

02_十进制化二进制01字串

/*
问题描述
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100

请按从小到大的顺序输出这32种01串。

输入格式
本试题没有输入。

输出格式
输出32行,按从小到大的顺序每行一个长度为5的01串。

样例输出
00000
00001
00010
00011
<以下部分省略>
*/



#include <iostream>
using namespace std;

// 转8位二进制
void dec_to_bin(int num) {
    int a[8] = {0};
    int temp = num;
    // 下标索引
    int index = 7;
    while (temp >= 1) {
        // 依次取每一位
        a[index] = temp % 2;
        index--;
        // 为了除掉后面的位
        temp = temp / 2;
    }

    for (int j = 0; j < 8; j++) cout << a[j];
    cout << endl;
}
void dec_to_bin_2(int num) {
    int a[8] = {};

    for (int i = 0; i < 8; i++) {
        a[i] = num & 1;
        num = num >> 1;
    }

    for (int i = 7; i >= 0; i--) cout << a[i];
}

void f() {
    for (int i = 0; i < 32; i++) {
        int a[5] = {0};
        int temp = i;
        // 下标索引
        int index = 4;
        while (temp >= 1) {
            // 依次取每一位
            a[index] = temp % 2;
            index--;
            // 为了除掉后面的位
            temp = temp / 2;
        }
        for (int j = 0; j < 5; j++) cout << a[j];
        
        cout << endl;
    }
}
int main() {
    // f();
    dec_to_bin_2(1);
    return 0;
}

10_十进制转十六进制

/*
问题描述
  十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。
输入格式
  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647
输出格式
  输出这个整数的16进制表示
样例输入
30
样例输出
1E
*/



#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
char to_hex(int num) {
    switch (num) {
    case 0:
        return '0';
    case 1:
        return '1';
    case 2:
        return '2';
    case 3:
        return '3';
    case 4:
        return '4';
    case 5:
        return '5';
    case 6:
        return '6';
    case 7:
        return '7';
    case 8:
        return '8';
    case 9:
        return '9';
    case 10:
        return 'A';
    case 11:
        return 'B';
    case 12:
        return 'C';
    case 13:
        return 'D';
    case 14:
        return 'E';
    case 15:
        return 'F';
    }
}

int main() {
    int num;
    cin >> num;
    string ans;
    while (num > 0) {
        ans += to_hex(num % 16);
        num /= 16;
    }
    // 空
    if (ans.empty())
        cout << 0 << endl;
    else {
        reverse(ans.begin(), ans.end());
        cout << ans << endl;
    }
    return 0;
}

11_十六进制转十进制

/*
问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。


样例输入
FFFF
样例输出
65535
*/


#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;

int to_dec(char c) {
    switch (c) {
    case '0':
        return 0;
    case '1':
        return 1;
    case '2':
        return 2;
    case '3':
        return 3;
    case '4':
        return 4;
    case '5':
        return 5;
    case '6':
        return 6;
    case '7':
        return 7;
    case '8':
        return 8;
    case '9':
        return 9;
    case 'A':
        return 10;
    case 'B':
        return 11;
    case 'C':
        return 12;
    case 'D':
        return 13;
    case 'E':
        return 14;
    case 'F':
        return 15;
    }
}

int main() {
    string str;
    // FFFF FFFF
    //不然数据溢出了
    long long sum = 0;
    cin >> str;
    // 利用反转了
    // reverse(str.begin(), str.end());
    // for (int i = 0; i < str.length(); i++)
    // {
    //     sum += to_dec(str[i]) * pow(16, i);
    // }

    // 不用反转
    for (int i = str.length() - 1; i >= 0; i--) {
        sum += to_dec(str[i]) * pow(16, str.length() - i - 1);
    }
    cout << sum;
    return 0;
}

12_十六进制转八进制

/*
问题描述
  给

以上是关于基础训练汇总的主要内容,如果未能解决你的问题,请参考以下文章

使用汇总操作训练 TensorFlow 模型比不使用汇总操作要慢得多

Pytorch模型训练实用教程学习笔记:三损失函数汇总

历史最全最新中文自然语言处理预训练模型汇总分享-内含免费下载地

深度神经网络模型训练中的 tricks(原理与代码汇总)

tricks深度神经网络模型训练中的 tricks(原理与代码汇总)

学习教程深度神经网络模型训练中的 tricks(原理与代码汇总)