蓝桥训练系统-基础训练-非VIP题

蓝桥训练系统-基础训练-非VIP题

数列排列

#include 
using namespace::std;
int a[205];
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> a[i];
    sort(a + 1, a + n + 1);
    for(int i = 1; i <= n - 1; ++i)
        cout << a[i] << ' ';
    cout << a[n];
    return 0;
}

偷个懒,直接调用STL中的sort,参数类型是 排序的首个元素地址, 排序的尾元素地址的下一个地址

十六进制转八进制

先将十六进制转换成二进制再把二进制转换成八进制, 十六进制一位数对应二进制四位数, 二进制三位数对应八进制一位数,

注意, 我们读取的十六进制数是一个字符串, 不能对字符类型的数字直接进行计算, 计算机会默认使用ASCII码计算, '0' ~ '9'对应的ASCII码是48 ~ 57, 所以可以通过char - 48将其处理成我们想要的数字进行计算

#include 

using namespace ::std;
const int maxlen = 1e5+5;
char s[maxlen];
int b[maxlen * 4], e[maxlen * 2];
int main()
{
    int n;
    cin >> n;
    while (n--)
    {

        cin >> s + 1;
        //十六进制->二进制
        for (int i = 1; i <= strlen(s + 1); ++i)
        {
            int temp;
            if (s[i] <= '9' && s[i] >= '0')
            temp = s[i] - 48;
            else if (s[i] == 'A')
            temp = 10;
            else if (s[i] == 'B')
            temp = 11;
            else if (s[i] == 'C')
            temp = 12;
            else if (s[i] == 'D')
            temp = 13;
            else if (s[i] == 'E')
            temp = 14;
            else if(s[i] == 'F')
            temp = 15;
            for (int j = 4 * (i - 1) + 4; j >= 4 * (i - 1) + 1; --j)
            {
                b[j] = temp % 2;
                temp /= 2;
            }
        }
        //二进制->八进制
        int j = 0;
        int i = 4 * strlen(s + 1);
        for(; i >= 3; i -= 3)
        {
            e[++j] = b[i] + b[i - 1] * 2 + b[i - 2] * 4;

        }
        if(i >= 2)
            e[++j] = b[i] + b[i - 1] * 2;
        else if(i >= 1)
            e[++j] = b[i];
        if(e[j] == 0)
            --j;
        for(int i = j; i >= 1; --i)
            cout << e[i];
        cout << endl;
    }
    return 0;
}

十六进制转十进制

#include 
using namespace ::std;
#define ll long long
char hexnum[10];
ll ans;
int main()
{
    cin >> hexnum + 1;
    ll flag = 1, temp;
    for(int i = strlen(hexnum + 1); i >= 1; --i)
    {
        if(hexnum[i] >= '0' && hexnum[i] <= '9')
            temp = hexnum[i] - 48;  //ASCII表中'0'~'9'对应十进制48~57
        else if(hexnum[i] == 'A')
            temp = 10;
        else if(hexnum[i] == 'B')
            temp = 11;
        else if(hexnum[i] == 'C')
            temp = 12;
        else if(hexnum[i] == 'D')
            temp = 13;
        else if(hexnum[i] == 'E')
            temp = 14;
        else if(hexnum[i] == 'F')
            temp = 15;
        ans += flag * temp;
        flag *= 16;
    }
    cout << ans;
    return 0;
}

输出为负数时要敏锐地察觉是不是结果超出了int的范围

十进制转十六进制

每一次都要考虑输入/输出是0的情况,一般测试点1都是0

#include 
using namespace ::std;
#define ll long long
ll a;
stack<char> ans;
int main()
{
    cin >> a;
    if(a == 0)
    {
        cout << a;
        return 0;
    }
    while(a > 0)
    {
        int temp = a % 16;
        if(temp <= 9 && temp >= 0)
            ans.push(temp + 48);    //'0' ~ '9' = 48 ~ 57
        else
            ans.push(temp + 55);    //'A' ~ 'F' = 65 ~ 70
        a /= 16;
    }
    while(!ans.empty())
    {
        cout << ans.top();
        ans.pop();
    }
    return 0;
}

特殊回文数

我的思路是枚举每个数, 把每个数位数倒置得出的数如果和原数相等,那么这个数就是回文数

五位数六位数这么搞确实不优雅

#include 
using namespace::std;
int main()
{
    int n;
    cin >> n;
    //五位数
    for(int i = 10000; i <= 99999; ++i)
    {
        int num = i, hnum = 0, cnt = 1, tmp = 0;
        while(num > 0)
        {
            hnum += num % 10 * pow(10, 5 - cnt);
            tmp += num % 10;
            num /= 10;
            cnt++;
        }
        if(hnum == i && tmp == n)
            cout << i << endl;

    }
    //六位数
    for(int i = 100000; i <= 999999; ++i)
    {
        int num = i, hnum = 0, cnt = 1, tmp = 0;
        while(num > 0)
        {
            hnum += num % 10 * pow(10, 6 - cnt);
            tmp += num % 10;
            num /= 10;
            cnt++;
        }
        if(hnum == i && tmp == n)
            cout << i << endl;

    }
    return 0;
}

回文数

#include 
using namespace::std;
int main()
{
    //四位数
    for(int i = 1000; i <= 9999; ++i)
    {
        int num = i, hnum = 0, cnt = 1;
        while(num > 0)
        {
            hnum += num % 10 * pow(10, 4 - cnt);
            num /= 10;
            cnt++;
        }
        if(hnum == i)
            cout << i << endl;
    }
    return 0;
}

特殊的数字(水仙花数)

#include 
using namespace::std;
int main()
{
    //三位数
    for(int i = 100; i <= 999; ++i)
    {
        int num = i, sxh = 0;
        while(num > 0)
        {
            sxh += pow(num % 10, 3);
            num /= 10;
        }
        if(sxh == i)
            cout << i << endl;
    }
    return 0;
}

杨辉三角形

边界dp[1][1] = 1

状态方程dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]

#include 
using namespace::std;
int dp[40][40];
int main()
{
    int n;
    cin >> n;
    dp[1][1] = 1;
    cout << dp[1][1] << endl;
    for(int i = 2; i <= n; ++i)
    {
        for(int j = 1; j < i; ++j )
        {
            dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
            cout << dp[i][j] << ' ';
        }
        dp[i][i] = 1;
        cout << dp[i][i];
        if(i < n)
            cout << endl;
    }
    return 0;
}

查找整数

#include 
using namespace::std;
int num[10005];
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> num[i];
    int a;
    cin >> a;
    bool flag = 0;
    for(int i = 1; i <= n; ++i)
    {
        if(num[i] == a)
        {
            flag = 1;
            cout << i;
            break;
        }
    }
    if(flag == 0)
        cout << -1;
    return 0;
}

数列特征(STL对数组求最值,求和)

max_element(begin, end), 求区间[begin, end)的最大值

min_element(begin, end), 求区间[begin, end)的最小值

accmulate(begin, end, 0),求区间[begin, end)的和, 这里0是和的初值

#include 
using namespace::std;
int num[10005];
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i)
        cin >> num[i];
    int *maxn = max_element(num + 1, num + n + 1);
    int *minn = min_element(num + 1, num + n + 1);
    int sum = accumulate(num + 1, num + n + 1, 0);
    cout << *maxn << endl;
    cout << *minn << endl;
    cout << sum << endl;
    return 0;
}

Fibonacci数列求模

#include 
using namespace::std;
int p[1000005];
int main()
{
    int n;
    cin >> n;
    p[1] = p[2] = 1;
    for(int i = 3; i <= n; ++i)
    {
        p[i] = (p[i - 1] + p[i - 2]) % 10007;
    }
    if(n < 3)
        cout << 1;
    else
        cout << p[n];
    return 0;
}

数太大, 不能先加再求模, 所以可以打表累加每一项的余数, 非余数部分对求模没有影响, 可以直接忽略

字母图形

#include 
using namespace::std;
char dp[30][30];
int main()
{
    int m, n;
    cin >> n >> m;
    for(int i = 1; i <= m; ++i)
        dp[1][i] = 'A' - 1 + i;
    for(int i = 2; i <= n; ++i)
        for(int j = 1; j <= m; ++j)
        {
            if(i <= j)
                dp[i][j] = dp[i - 1][j - 1];
            else
                dp[i][j] = dp[i - 1][j] + 1;
        }
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= m; ++j)
            cout << dp[i][j];
        if(i < n)
            cout << endl;
    }
    return 0;
}

观察图像,沿对角线把图像分成两半, 分两种情况找到一些规律

你可能感兴趣的:(PAT/蓝桥/洛谷刷题存档,算法,数据结构,基础,stl,字符串)