Eagle233-Blog

Programming Ability Training - All Codes


Categories 课内 In Class Practices
Tags

2.5k Words   |   14 Minutes

Weel 1

A Problem A+B (Big Integer)

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main(void)
{
    string a, b;
    while (cin >> a >> b)
    {
        string s;
        reverse(a.begin(), a.end()); // 翻转字符串功能
        reverse(b.begin(), b.end());

        int length = max(a.length(), b.length());
        int carry = 0;
        for (int i = 0; i < length; i++)
        {
            int digit_a = i < a.length() ? a[i] - '0' : 0;
            int digit_b = i < b.length() ? b[i] - '0' : 0;
            int sum = digit_a + digit_b + carry;
            carry = sum / 10;
            sum %= 10;
            s.push_back(sum + '0');
        }

        if (carry)
        {
            s.push_back('1');
        }
        reverse(s.begin(), s.end());

        cout << s << endl;
    }
}

B 几位数

#include <stdio.h>
#include <string.h>

int main(void)
{
    char s[500000];
    while (scanf("%s", s) != EOF)
    {
        int length = strlen(s);
        printf("%d\n", length);
    }
}

C 随机排序

#include <bits/stdc++.h>
#include <cctype>

using namespace std;

int prime[26];

bool cmp(const string& a, const string& b)
{
    int length = min(a.length(), b.length());
    for (int i = 0; i < length; i++)
    {
        if (a[i] != b[i])
        {
            if (a[i] - b[i] == 'a' - 'A')
            {
                return b[i] > a[i];
            }
            else if (b[i] - a[i] == 'a' - 'A')
            {
                return a[i] < b[i];
            }
            return prime[toupper(a[i]) - 'A'] < prime[toupper(b[i]) - 'A'];
        }
    }
    return a.length() < b.length();
}

int main(void)
{
    string s;
    while (cin >> s)
    {
        for (int i = 0; i < s.length(); i++)
        {
            prime[s[i] - 'A'] = i;
        }

        getchar();

        string words;
        getline(cin, words); // 获取整行

        vector<string> v;

        int index = 0;
        for (int i = 0; i <= words.length(); i++)
        {
            if (i == words.length() || words[i] == ' ')
            {
                string word = words.substr(index, i - index);
                v.push_back(word);
                index = i + 1;
            }
        }

        sort(v.begin(), v.end(), cmp);
        for (string &word : v)
        {
            cout << word << " ";
        }
        cout << endl;
    }
}

D 行数据的排序

#include <bits/stdc++.h>

using namespace std;

bool cmp(const vector<int>& a, const vector<int>& b)
{
    int length = min(a.size(), b.size());
    for (int i = 0; i < length; i++)
    {
        if (a[i] != b[i])
        {
            return a[i] > b[i];
        }
    }
    return a.size() < b.size();
}

int main(void)
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i++)
    {
        int m;
        cin >> m;
        getchar();

        if (m == 1)
        {
            string s;
            getline(cin, s);
            int length = s.length();
            cout << s.substr(0, length - 3) << endl;
        }

        else
        {
            vector<vector<int>> v;
            for (int i = 0; i < m; i++)
            {
                string s;
                vector<int> temp;
                getline(cin, s);
                s = s.substr(0, s.length() - 3);

                int index = 0;
                for (int i = 0; i <= s.length(); i++)
                {
                    if (s[i] == ' ' || i == s.length())
                    {
                        temp.push_back(stoi(s.substr(index, i - index)));
                        index = i + 1;
                    }
                }

                v.push_back(temp);
            }
            sort(v.begin(), v.end(), cmp);
            for (const vector<int>& vec : v)
            {
                for (const int& v : vec)
                {
                    cout << v << " ";
                }
                cout << endl;
            }
        }
    }
}

E 按数据中1的位数排序

#include <bits/stdc++.h>
#include <bitset>

using namespace std;

bool cmp(const long long &a, const long long &b) {
    bitset<120> binaryA(a); // 转为 binary
    bitset<120> binaryB(b);
    if (binaryA.count() == binaryB.count()) { // 方法 count() 统计1的个数
        return a < b;
    }
    return binaryA.count() > binaryB.count();
}

int main(void) {
    int n;
    cin >> n;
    getchar();
    for (int i = 0; i < n; i++) {
        cout << "case #" << i << ":" << endl;
        int m;
        cin >> m;

        vector<long long> v;
        for (int j = 0; j < m; j++) {
            long long num;
            cin >> num;
            v.push_back(num);
        }

        sort(v.begin(), v.end(), cmp);

        for (long long l : v) {
            cout << l << " ";
        }
        cout << endl;
    }
}

F 字符频率

#include <bits/stdc++.h>

using namespace std;

vector<double> f(26);

bool cmp(const char &a, const char &b) {
    char m = toupper(a);
    char n = toupper(b);
    if (m == n) {
        return a > b; // 1为a在前,0为b在前
    }

    int indexA = m - 'A';
    int indexB = n - 'A';
    if (f[indexA] == f[indexB]) {
        return m < n;
    }
    return f[indexA] > f[indexB];
}

int main(void) {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cout << "case #" << i << ":" << endl;
        for (int j = 0; j < 26; j++) {
            cin >> f[j];
        }

        string s;
        cin >> s;
        
        sort(s.begin(), s.end(), cmp);

        cout << s << endl;
    }
}

G 极坐标排序

#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip> 

using namespace std;

struct Point
{
    double p;
    double t;
};

bool cmp(const Point& a, const Point& b);

int main(void)
{
    int c;
    cin >> c;

    for (int i = 0; i < c; i++)
    {
        cout << "case #" << i << ":" << endl;
        int n;
        cin >> n;

        vector<Point> points(n);
        for (int j = 0; j < n; j++)
        {
            double x, y;
            cin >> x >> y;

            points[j].p = sqrt(x * x + y * y);

            points[j].t = atan2(y, x); // 计算弧度,返回范围是-pai到pai
            if (points[j].t < 0)
            {
                points[j].t += 2 * M_PI;
            }
        }

        sort(points.begin(), points.end(), cmp);

        for (const Point &p : points)
        {
            cout << fixed << setprecision(4); // 保留四位
            cout << "(" << p.p << "," << p.t << ")" << endl;
        }
    }
}

bool cmp(const Point& a, const Point& b)
{
    if (a.t == b.t)
    {
        return a.p > b.p;
    }
    return a.t < b.t;
}

H 字串非重复字符数排序

#include <bits/stdc++.h>

using namespace std;

int times(string a) {
    vector<bool> t(26, false); // 注意初始化格式
    for (char s : a) {
        t[s - 'A'] = true;
    }

    int times = 0;
    for (int i = 0; i < 26; i++) {
        if (!t[i]) {
            times++;
        }
    }
    return times;
}

bool cmp(const string &a, const string &b) {
    int timesA = times(a);
    int timesB = times(b);

    if (timesA == timesB) {
        return a < b;
    }
    return timesA < timesB;
}

int main(void) {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cout << "case #" << i << ":" << endl;
        int m;
        cin >> m;

        vector<string> v;
        for (int j = 0; j < m; j++) {
            string s;
            cin >> s;
            v.push_back(s);
        }

        sort(v.begin(), v.end(), cmp);
        for (string s : v) {
            cout << s << endl;
        }
    }
}

I KL排序

#include <bits/stdc++.h>

using namespace std;

struct KL {
    double value;
    int id;
};

bool cmp(const KL &a, const KL &b) {
    if (fabs(a.value - b.value) < 1e-7) {
        return a.id < b.id;
    }
    return a.value < b.value;
}

int main(void) {
    int m;
    cin >> m;
    for (int i = 0; i < m; i++) {
        cout << "case #" << i << ":" << endl;
        int k, n;
        cin >> k >> n;

        vector<vector <int>> v;
        for (int j = 0; j < n + 1; j++) {
            vector<int> temp;
            for (int c = 0; c < k; c++) {
                int tempNumber;
                cin >> tempNumber;
                temp.push_back(tempNumber);
            }

            v.push_back(temp);
        }

        vector<int> M(n + 1, 0);
        for (int j = 0; j < n + 1; j++) {
            for (int c = 0; c < k; c++) {
                M[j] += v[j][c];
            }
        }

        vector<vector <double>> p;
        for (int j = 0; j < n + 1; j++) {
            vector<double> temp;
            for (int c = 0; c < k; c++) {
                double tempNumber = (v[j][c] + (double)1.0 / k) / (M[j] + 1);
                temp.push_back(tempNumber);
            }

            p.push_back(temp);
        }

        vector<KL> kl;
        for (int j = 1; j < n + 1; j++) {
            double temp = 0;
            for (int c = 0; c < k; c++) {
                if (p[0][c] > 0 && p[j][c] > 0) {
                    temp += p[0][c] * log(p[0][c] / p[j][c]);
                }
            }
            if (fabs(temp) < 1e-7) {
                temp = 0.0000;
            }
            KL tempKL;
            tempKL.id = j;
            tempKL.value = temp;
            kl.push_back(tempKL);
        }

        sort(kl.begin(), kl.end(), cmp);

        for (KL tp : kl) {
            cout << tp.id << " " << fixed << setprecision(4) << tp.value << endl; // 回忆一下 setprecision
        }
    }
}

Week 2

J 内存显示

#include <bits/stdc++.h>

using namespace std;

bool isDecimal(string b) {
    // return a != floor(a); // floor 返回的是整数部分
    for (int i = 0; i < b.length(); i++) {
        if (b[i] == '.') {
            return true;
        }
    }
    return false;
}

int main(void) {
    string a;
    char *b;
    while (cin >> a) {
        double m = stod(a);
        if (isDecimal(a)) {
            b = (char *)&m;
            for (int i = 0; i < 8; i++) {
                printf("%02x ", (unsigned char)*b); // %02x 用于输出每个字节的十六进制表示
                b++;
            }
        } else {

            int c = (int)m;
            b = (char *)&c;
            for (int i = 0; i < 4; i++) {
                printf("%02x ", (unsigned char)*b);
                b++;
            }
        }

        cout << endl;
    }
}

K 二进制倒置

#include <bits/stdc++.h>

using namespace std;

// 这个考试一定要带进去,根本做不来
string convert(int n, string s, int m) {
    // 将输入字符串从n进制转换为十进制
    vector<int> decimal_digits;
    for (char c : s) {
        int carry = c - '0';
        for (int &d : decimal_digits) {
            d = d * n + carry;
            carry = d / 10;
            d %= 10;
        }
        while (carry) {
            decimal_digits.push_back(carry % 10);
            carry /= 10;
        }
    }

    // 将十进制转换为m进制
    string result;
    vector<int> value(decimal_digits);
    do {
        int carry = 0;
        for (int i = value.size() - 1; i >= 0; --i) {
            carry = carry * 10 + value[i];
            value[i] = carry / m;
            carry %= m;
        }
        result.push_back('0' + carry);
        while (value.size() > 1 && value.back() == 0) {
            value.pop_back();
        }
    } while (!value.empty() && !(value.size() == 1 && value[0] == 0));

    reverse(result.begin(), result.end());
    return result;
}

int main(void) {
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cout << "case #" << i << ":" << endl;
        string s;
        cin >> s;
        string s2 = convert(10, s, 2);
        reverse(s2.begin(), s2.end());

        while (s2.size() > 1 && s2[0] == '0') {
            s2 = s2.substr(1);
        }

        string s3 = convert(2, s2, 10);
        cout << s3 << endl;
    }
}

L 平衡三进制

#include <bits/stdc++.h>

using namespace std;

int main(void) {
    string s;
    cin >> s;
    int index = s.find('.');
    if (index == -1) {
        index = s.length();
    }

    long long a = 0;
    // 计算整数部分
    long long power = 1;
    for (int i = index - 1; i >= 0; i--) {
        if (s[i] == '1') {
            a += power;
        } else if (s[i] == '2') {
            a -= power;
        }
        power *= 3;
    }

    // 计算小数部分
    long long b = 0, c = 1;
    for (int i = index + 1; i < s.length(); i++) {
        if (s[i] == '1') {
            b = b * 3 + 1;
            c *= 3;
        } else if (s[i] == '2') {
            b = b * 3 - 1;
            c *= 3;
        } else {
            b *= 3;
            c *= 3;
        }
    }

    // 带分数怎么计算:取决于符号位

    if (a > 0 && b < 0) {
        b = c + b;
        a -= 1;
    } else if (a < 0 && b > 0) {
        b = c - b;
        a += 1;
    }

    long long gcda = gcd(abs(b), c);
    b /= gcda;
    c /= gcda;

    if (index == s.length()) {
        cout << a << endl;
        return 0;
    }
    if (a == 0) {
        cout << b << " " << c << endl;
    } else {
        cout << a << " " << abs(b) << " " << c << endl;
    }
}

M 神秘信息

#include <bits/stdc++.h>

using namespace std;

long long convert(string s) {
    vector<int> digit;
    unordered_map<char, int> m; // HashTable
    int base = 0;
    for (char c  : s) {
        if (m.find(c) == m.end()) {
            if (base == 0) {
                m[c] = 1;
            } else if (base == 1) {
                m[c] = 0;
            } else {
                m[c] = base;
            }
            base++;
        }
        digit.push_back(m[c]);
    }

    base = max(base, 2); // 不是一进制
    long long result = 0;
    for (int i : digit) {
        result = result * base + i;
    }
    return result;
}

int main(void) {
    int n;
    cin >> n;
    cin.ignore();
    for (int i = 0; i < n; i++) {
        cout << "case #" << i << ":" << endl;
        string a;
        cin >> a;
        cout << convert(a) << endl;
    }
}

N 数据密度

#include <bits/stdc++.h>

using namespace std;

int main(void) {
    int n;
    cin >> n;
    cin.ignore();  // 清除换行符
    for (int i = 0; i < n; i++) {
        string a;
        getline(cin, a);

        int m = 0;
        int n = a.length() * 8;
        for (int h = 0; h < a.length(); h++) {
            int c = a[h];
            bitset<8> d(c);
            m += d.count();
        }

        int gcda = gcd(m, n); // 为什么要先提取出来?
        m /= gcda; // 最小公因数
        n /= gcda;
        cout << m << "/" << n << endl;
    }
}

Page views: Loading...  ·  Visitors: Loading...
Except where otherwise noted, original content on this site is dedicated to the public domain under CC0 1.0.
Powered by Hexo & Theme mdsuper
沪ICP备2026040813号
Search