OpenJudge – NOI – 1.13编程基础之综合应用(C++语言)

01:数制转换

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

using namespace std;

string getAns(string CusNum, int Format, int AnsFormat) {
    string Ans = "";
    int DecNum = 0;
    const char Num2Char[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                               'B', 'C', 'D', 'E', 'F' };

    for (int i = 0; i < CusNum.length(); ++i) {
        if ('0' <= CusNum[i] && CusNum[i] <= '9') {
            CusNum[i] -= '0';
        }
        else if ('a' <= CusNum[i] && CusNum[i] <= 'f') {
            CusNum[i] -= ('a' - 10);
        }
        else {
            CusNum[i] -= ('A' - 10);
        }

        DecNum += CusNum[i] * pow(Format, CusNum.length() - i - 1);
    }

    if (DecNum == 0) { /* 特殊情况 */
        Ans += '0';
        return Ans;
    }

    while (DecNum > 0) { 
        Ans += Num2Char[DecNum % AnsFormat]; /* 按照之前声明的表,找到对应的值 */
        DecNum /= AnsFormat;
    }

    reverse(Ans.begin(), Ans.end()); /* 字符串需要倒序 */

    return Ans;
}

int main(void) {
    int a, b;
    string n;
    cin >> a >> n >> b;
    cout << getAns(n, a, b);
    return 0;
}

02:不吉利日期

#include<iostream>

using namespace std;

int main(void) {
    const int Months[] = { 0, 12, 31, 28, 31, 30, 31, 30, 31, 31, 30,
                          31, 30, 31 };

    int w;
    cin >> w;
    for (int i = 1; i <= 12; ++i) {
        w += (Months[i] % 7);
        w %= 7;

        if (w == 5) {
            cout << i << endl;
        }
    }

    return 0;
}

03:八进制小数

#include<iostream>
#include<string>
#include<iomanip>
#include<cmath>

using namespace std;

int main(void) {
    string OctNum;
    cin >> OctNum;

    double Ans = 0;
    for (int i = OctNum.length() - 1; i >= 2; --i) {
        Ans += (OctNum[i] - '0') * 1.0;
        Ans /= 8;
    }

    /* 这里注意一下C++中的输出格式控制 */
    cout << OctNum << " [8] = " << setiosflags(ios::fixed) 
         << setprecision(3 * (OctNum.length() - 2)) << Ans << " [10]" << endl;

    return 0;
}

04:垂直直方图

#include<iostream>
#include<string>

using namespace std;

int main(void) {
    int LetHeight[150] = { 0 };
    int MapFlag[325][150] = { 0 };
    int MaxLetHeight = 0;

    for (int i = 1; i <= 4; ++i) {
        string ReadStr;
        getline(cin, ReadStr);

        for (int i = 0; i < ReadStr.length(); ++i) {
            if (ReadStr[i] != ' ') { /* 不是空格字符 */
                MapFlag[LetHeight[ReadStr[i]]][ReadStr[i]] = 1;

                if (MaxLetHeight < LetHeight[ReadStr[i]]) {
                    MaxLetHeight = LetHeight[ReadStr[i]];
                }

                LetHeight[ReadStr[i]]++;
            }
        }
    }

    for (int i = MaxLetHeight; i >= 0; --i) {
        for (int j = 'A'; j <= 'Z'; ++j) {
            if (MapFlag[i][j] == 1) {
                cout << "* ";
            }
            else {
                cout << "  ";
            }
        }

        cout << endl;
    }

    cout << "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" << endl;

    return 0;
}

05:素数回文数的个数

#include<iostream>

using namespace std;

/* 是否为质数 */
bool isPrime(int Num) {
    for (int i = 2; i * i <= Num; ++i) {
        if (Num % i == 0) {
            return false;
        }
    }

    return true;
}

/* 是否为回文数 */
bool isPalin(int Num) {
    int Ans = 0, Temp = Num;

    while (Num > 0) {
        Ans = (Num % 10 + Ans * 10);
        Num /= 10;
    }

    if (Ans == Temp) {
        return true;
    }
    else {
        return false;
    }
}

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

    int Cnt = 0;
    for (int i = 11; i <= n; ++i) {
        if (isPalin(i) && isPrime(i)) {
            Cnt++;
        }
    }

    cout << Cnt << endl;

    return 0;
}

06:循环数

这道题博主觉得有些问题,尤其是范围和测试数据。

#include<iostream>
#include<string>
#include<vector>

using namespace std;

int main(void) {
    string NumStr;
    cin >> NumStr;
    int Len = NumStr.length();

    vector<int> Num(65); /* 防止溢出 */
    for (int i = 0; i < Len; ++i) {
        Num[i] = NumStr[i] - '0';
    }

    NumStr += NumStr; /* 运算符重载,使数字串首位相接 */

    vector<int> Ans(65);
    for (int i = 1; i <= Len; ++i) {
        string TempStr = "";
        int Res = 0;
        for (int j = Len - 1; j >= 0; --j) {
            int Temp = Num[j] * i + Res;
            Res = Temp / 10;
            Ans[j] = Temp % 10;
        }
        for (int k = 0; k < Len; ++k) {
            TempStr += (char)Ans[k] + '0';
        }
        if (NumStr.find(TempStr, 0) == -1) {
            cout << '0' << endl;
            return 0;
        }
    }

    cout << '1' << endl;

    return 0;
}

07:玛雅历

#include<iostream>
#include<string>

using namespace std;

string HaabMonName[] = { "pop", "no", "zip", "zotz", "tzec", "xul", "yoxkin", "mol", "chen", 
                         "yax", "zac", "ceh", "mac", "kankin", "muan", "pax", "koyab", "cumhu", "uayet"
};

string TzolkinDayName[] = { "imix", "ik", "akbal", "kan", "chicchan", "cimi", "manik", "lamat", "muluk",
                            "ok", "chuen", "eb", "ben", "ix", "mem", "cib", "caban", "eznab", "canac", "ahau"
};

void Haab2Tzolkin(int Day, string Month, int Year) {
    int TotalDay = Year * 365;

    int i;
    for (i = 0; i <= 18; ++i) {
        if (Month == HaabMonName[i]) {
            break;
        }
    }

    TotalDay += 20 * i + Day; /* 从0开始的天数 */

    int TzolkinYear = TotalDay / 260; /* 一年260天 */

    TotalDay %= 260; /* 不足260天,构不成一年 */

    string TzolkinName = TzolkinDayName[TotalDay % 20]; /* 20天一个时期 */

    int TzolkinDay = TotalDay % 13 + 1; /* 天数是从1开始计算的 */

    cout << TzolkinDay << " " << TzolkinName << " " << TzolkinYear << endl;
}

int main(void) {
    int Cnt;
    cin >> Cnt;
    cout << Cnt << endl;

    for (int i = 1; i <= Cnt; ++i) {
        int Day;
        string Month;
        int Year;
        char ToolCh;
        cin >> Day >> ToolCh >> Month >> Year;
        Haab2Tzolkin(Day, Month, Year);
    }

    return 0;
}

08:特殊日历计算

#include<iostream>

using namespace std;

bool isLeapYear(int year) {
    if (year % 400 == 0 || year % 4 == 0 && year % 100 != 0) {
        return true;
    }
    return false;
}

void getSpecCal(int hour, int min, int sec, int day, int month, int year) {
    int TotalDay = 0;
    int TotalSec = 0;

    /* 年 */
    for (int i = 2000; i < year; ++i) {
        if (isLeapYear(i)) /* 判断闰年 */
            TotalDay += 366;
        else
            TotalDay += 365;
    }

    /* 月 */
    const int ComMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
    for (int i = 0; i < month - 1; ++i) {
        TotalDay += ComMonth[i];
    }
    if (month > 2 && isLeapYear(year)) {
        TotalDay++;
    }

    /* 日 */
    TotalDay += (day - 1);

    /* 小时,分钟,秒 */
    TotalSec += hour * 3600 + min * 60 + sec;
    TotalSec = TotalSec * 125 / 108; /* 该历法的一天和我们的一天一样长 */

    /* 转化 */
    int SpecYear = TotalDay / 1000;
    int SpecMonth = TotalDay % 1000 / 100 + 1;
    int SpecDay = TotalDay % 1000 % 100 + 1;
    int SpecHour = TotalSec / 10000;
    int SpecMin = TotalSec % 10000 / 100;
    int SpecSec = TotalSec % 10000 % 100;

    cout << SpecHour << ":" << SpecMin << ":" << SpecSec << " "
         << SpecDay << "." << SpecMonth << "." << SpecYear << endl;
}

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

    for (int i = 1; i <= Cnt; ++i) {
        int Hour, Min, Sec, Day, Month, Year;
        char ToolChar;
        cin >> Hour >> ToolChar >> Min >> ToolChar >> Sec >> Day >> ToolChar >> Month  >> ToolChar >> Year;
        getSpecCal(Hour, Min, Sec, Day, Month, Year);
    }

    return 0;
}

10:判决素数个数

#include<iostream>

using namespace std;

bool isPrime(int Num) {
    for (int i = 2; i * i <= Num; ++i) {
        if (Num % i == 0)
            return false;
    }
    return (Num != 1);
}

int main(void) {
    int X, Y;
    cin >> X >> Y;

    if (X > Y) /* 这里是一个扣分点 */
        swap(X, Y);

    int Cnt = 0;
    for (int i = X; i <= Y; ++i) {
        if (isPrime(i))
            Cnt++;
    }

    cout << Cnt << endl;

    return 0;
}
  • 暂未补完

原文链接: https://www.cnblogs.com/liuzhaotong/p/12452399.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    OpenJudge - NOI - 1.13编程基础之综合应用(C++语言)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/336780

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午10:49
下一篇 2023年3月1日 下午10:52

相关推荐