MJUPC-022_编程挑战系列赛第二十二场(以梦为“码“ “数“说未来)题解(C/C++代码)

题目一:Hello MJUers

输出一个数学与数据科学学院(软件学院)社管中心科技部的Logo,做为打开MJUPC编程挑战系列赛大门的敲门砖。
img
此题为签到题,没有难度,但因Logo字符画中包含一些转义字符,需要逐行输出,比较麻烦费时,细心即可。

下面是本题题解C代码,代码19行“Ycnjt///tv+”处有11个“/” ,由于“/t”转义字符的原因此行不能正常显示,提交测试时要注意检查此行

#include<stdio.h>
int main(void)
{
    
	printf("                             .'^\"\"\"\"^''\n");
	printf("                      `;>-}|/jrxnuuunrjt(}_i:^. \n");
	printf("                  ^>}/xvzzzzcccccccccccczzzzvnj(-l`\n");
	printf("               :-/uzzzccvcczzzzzcvvvvvvczzzzccczzcx(<^\n");
	printf("            '>\\vXzcvcczzcur/1?+>l:,,,,:li+[|rvzcvvczzn(-I'              \n");
	printf("          `?rzzcvczzcr(-l^     .'`\"\"\".      ';_fzcvvvczzzu)!.           \n");
	printf("        .+xzcvcczv/_:  .,i?)/rnczXUUJ/         .>rzvvvvvvzJCn-`         \n");
	printf("       !fzcvczcf_\" '!}fcUCCCCCCJJJJJCu.          ^jcvvvvvcnvCCc_.       \n");
	printf("     '}czvvzc(I ^+tXCCCJJJJJJJJJJJJJCv'           >zvvvvvvvtnJCLr;      \n");
	printf("    ^/Xcvcz\\; I|YLCJJJJJJJJJJJJJJJJJJX^           ,vcvvvvvcf/xJJCY~     \n");
	printf("   ^fzvvcv~ ljJLJJJJJJJJJJJJJJJJJJJJJJI           izvvvvvcutt/nJJCC~    \n");
	printf("  .(Xvvzn;^|JCJJJJJJJJJJJJJJJJJJJJJJJC!          ./zvvvvcvjttttYJJCU;   \n");
	printf("  izvvcv;;cLJJJJJJJJJJJJJJJJJJJJJJJJJCi         .{zvvvvcvjtttt/vCJJCr.  \n");
	printf("  \\zvvX-lYCJJJJJJJJJJJJJUYzcunnxnuvXUQ_        `1zcvvccufttttttnJJJJL+  \n");
	printf(" `ncvcv+XCJJJJJJJJJJYcnjt///tv+       ljzcvccurttttttt/nJJJJCj  \n");
	printf(" \"vcvvvUCJJJJJJJJYvj/\\\\/t\\[+<>i><_?{|{'    `>(czccvnjttttttttt/zJJJJCX` \n");
	printf(" ;ccvvzJJJJJJJJzx/\\\\tnn1!^          '''\"l_(nzzvuxjfttttttttttfrJJJJJCY^ \n");
	printf(" 'xcvvXJJJJJJXr\\\\txzCxI         !}{)|/rnvvuxjjftttttttttttttj{tCJJJJCn. \n");
	printf("  {XvvXJJJJJu/\\tuUJL|'          ?rjrrjjftttttttttttttttttttj{:cCJJJJQ[  \n");
	printf("  \"ucvzJJJJr\\/nUCJCj.           [ftttttttttttttttttttttttff?'/LJJJJCc^  \n");
	printf("   ]XvcUJCu\\/cJJJJC!           .(ftttttttttttttttttttttfj)l )LJJJJJJi   \n");
	printf("   '/XvXJU/\\cJJJJJJ:           '\\fttttttttttttttttttfff)>.'\\LJJJJCJ+    \n");
	printf("    ^fXcUX|xCJJJJJC_           ,tftttttttttttttttfjj\\]I  lnLJJJJCY>     \n");
	printf("     `(zzXjYJJJJJJCc:          ;jtttttttttttfffjf|]!'  :)UCJJJJLr;      \n");
	printf("       +xzczJJJJJJJCz?`        !rjfffffffjjf/([<:'   I\\YLJJJJCX?.       \n");
	printf("        ^[uzXJJJJJJJJCc)!'     '<[1(|(){]_>;^     :?rJCJJJJLU(\"         \n");
	printf("          \"]nYJJJJJJJJJCJv\\-l\"'             .^I+)nUCCJJJCLY(;           \n");
	printf("            \"]jXCCCJJJJJJCCCJYvr/)}]?_?[})\\ruXJCCCJJJCCCv},             \n");
	printf("              .:<?rUCCCJJJJJJJCCCCCCCCCCCCCCCJJJJCCCUu)!'               \n");
	printf("                   :?/cUCCCCCCJJJJJJJJJJJCCCCCCJXn|_;.                  \n");
	printf("                      ':>](fnczYUUUUUUYXcurt)]<I^.                      \n");
	printf("                            .'^:;;;;;;:\"`.                               \n");
    
	return 0;
}

题目二:水仙花数

水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身,例如:
1 3 + 5 3 + 3 3 = 153 3 3 + 7 3 + 0 3 = 370 3 3 + 7 3 + 1 3 = 371 4 3 + 0 3 + 7 3 = 407 1^{3}+5^{3}+3^{3}=153\qquad3^{3}+7^{3}+0^{3}=370\qquad3^{3}+7^{3}+1^{3}=371\qquad4^{3}+0^{3}+7^{3}=407 13+53+33=15333+73+03=37033+73+13=37143+03+73=407
水仙花数只是自幂数的一种,严格来说3位数的3次幂数才称为水仙花数。

下面是本题题解C++代码,题目解法不唯一,供大家交流参考:

#include"iostream"
#include"cmath"
using namespace std;
int main() {
    int n;
    cin>>n;
    int m=(n/100)*(n/100)*(n/100)+((n/10)%10)*((n/10)%10)*((n/10)%10)+(n%10)*(n%10)*(n%10);
    if(m==n){
        cout<<"yes";
    }else{
        cout<<"no";
    }
}

题目三:一元二次方程求解

此 题 需 注 意 输 出 格 式 , 只 有 一 个 解 时 输 出 x 即 可 , 有 两 个 解 时 需 输 出 x 1 x 2 ( x 1 < x 2 ) , 且 需 保 留 两 位 小 数 输 出 。 此题需注意输出格式,只有一个解时输出x即可,有两个解时需输出x_1 \quad x_2(x_1<x_2),且需保留两位小数输出。 xx1x2(x1<x2),
一 元 二 次 方 程 的 一 般 形 式 是 a x 2 + b x + c = 0 ( a ≠ 0 ) , 其 中 a x 2 是 二 次 项 , a 是 二 次 项 系 数 ; b x 是 一 次 项 , b 是 一 次 项 系 数 ; c 是 常 数 项 。 一元二次方程的一般形式是 ax^{2}+bx+c=0(a≠0),其中ax^{2}是二次项,a是二次项系数;bx是一次项,b是一次项系数;c是常数项。 ax2+bx+c=0a=0ax2abxbc
使 一 元 二 次 方 程 左 右 两 边 相 等 的 未 知 数 的 值 叫 做 一 元 二 次 方 程 的 解 , 也 叫 做 一 元 二 次 方 程 的 根 。 求 根 公 式 为 x = − b ± b 2 − 4 a c 2 a 使一元二次方程左右两边相等的未知数的值叫做一元二次方程的解,也叫做一元二次方程的根。 求根公式为x=\frac {-b±\sqrt {b^{2}-4ac}}{2a} 使x=2ab±b24ac
下面是本题题解C++代码,题目解法不唯一,供大家交流参考:

#include"iostream"
#include"cmath"
using namespace std;
int main() {

    double a,b,c;
    scanf("%lf %lf %lf",&a,&b,&c);
    double d=b*b-4*a*c;
    if(d<0){
        cout<<"NO";
    } else if(d==0){
        printf("%0.2f",(-b+ sqrt(d))/(2*a));
    }else{
        printf("%0.2f %0.2f",min((-b- sqrt(d))/(2*a),(-b+ sqrt(d))/(2*a)),max((-b- sqrt(d))/(2*a),(-b+ sqrt(d))/(2*a)));
    }

}

题目四:成绩排序

给出学生姓名和成绩,现在请你将他们按照成绩从低到高的顺序排列有序。

此题需注意输入、输出格式,第一行输入N表示要录入N个学生的信息,后面N行输入N个学生的姓名(字符串)与成绩(以空格隔开),输出时需输出N行数据,每行一个字符串和一个数字,用冒号隔开,表示学生的姓名和成绩,输出的成绩要保留1位小数,若成绩相同则按输入时的先后顺序输出。
数 据 范 围 为 N ≤ 1 0 5 , 姓 名 字 符 串 长 度 不 超 过 10 , 成 绩 的 范 围 为 [ 0 , 100 ] 。 数据范围为 N ≤ {10^{5}},姓名字符串长度不超过10,成绩的范围为[0,100]。 N105,10[0,100]
由于N的范围较大,使用冒泡排序时间复杂度太高,会导致超时问题;使用选择排序也无法通过此题,选择排序为不稳定排序,不能保证成绩相同时按照输入的先后顺序输出;需要使用时间复杂度为N(nlogn)的稳定排序算法,这里选择使用归并排序来解决此题。

下面是本题题解C++代码,题目解法不唯一,供大家交流参考:

#include"iostream"
using namespace std;
struct Grade{
    double grade;
    char name[15];
}grades[100005],temp[100005];

void merge_sort(int l,int r){
    if(l>=r)
        return;
    int mid=(l+r)>>1;
    merge_sort(l,mid), merge_sort(mid+1,r);
    int i=l,j=l,k=mid+1;
    while (i<=mid&&k<=r){
        if(grades[i].grade<=grades[k].grade)temp[j++]=grades[i++];
        else temp[j++]=grades[k++];
    }
    while (i<=mid)temp[j++]=grades[i++];
    while (k<=r)temp[j++]=grades[k++];
    for (int m = l; m <= r; ++m) {
        grades[m]=temp[m];
    }
}

int main() {
    int N;
    scanf("%d",&N);
    for (int i = 0; i < N; ++i) {
        scanf("%lf %s",&grades[i].grade,&grades[i].name);
    }
    merge_sort(0,N-1);
    for (int i = 0; i < N; ++i) {
        printf("%s:%.1lf\n",grades[i].name,grades[i].grade);
    }
}

题目五:统计字符

现给出一段由大写字母组成的字符串,要求你输出每个大写字母出现的次数,其中未出现的字母不需要输出,输出的顺序为A~Z。

格式要求输入一串由大写字母组成的字符串,输出时按A~Z顺序逐行输出,并在字母后标明此字母出现次数(以冒号隔开)。

下面是本题题解C++代码,题目解法不唯一,供大家交流参考:

#include <bits/stdc++.h>
using namespace std;
int a[26];
int main(){
    string s;
    cin>>s;
    for(char i:s)
    a[i-'A']++;
    for(int i=0;i<26;i++){
        if(a[i]){
            cout<<(char)('A'+i)<<':'<<a[i]<<endl;
        }
    }
}

题目六:天干地支

干支纪年,是指中国纪年历法,自上古以来就一直使用的纪年方法。干支是天干和地支的总称。把干支顺序相配正好六十为一周,周而复始,循环记录,这就是俗称的“干支表”。干支纪年以每年以立春进入下一年。

下表为干支次序表:

01甲子02乙丑03丙寅04丁卯05戊辰06己巳07庚午08辛未09壬申10癸酉
11甲戌12乙亥13丙子14丁丑15戊寅16己卯17庚辰18辛巳19壬午20癸未
21甲申22乙酉23丙戌24丁亥25戊子26己丑27庚寅28辛卯29壬辰30癸巳
31甲午32乙未33丙申34丁酉35戊戌36己亥37庚子38辛丑39壬寅40癸卯
41甲辰42乙巳43丙午44丁未45戊申46己酉47庚戌48辛亥49壬子50癸丑
51甲寅52乙卯53丙辰54丁巳55戊午56己未57庚申58辛酉59壬戌60癸亥

每十年天干循环一轮,每十二年地支循环一轮,用年份取余后输出即可。

#include"iostream"
using namespace std;
int main(){
    int N;
    scanf("%d",&N);
    while (N--) {
        string s[10] = {"jia", "yi", "bing", "ding", "wu", "ji", "geng", "xin", "ren", "gui"};
        string s1[12] = {"zi", "chou", "yin", "mao", "chen", "si", "wu", "wei", "shen", "you", "xu", "hai"};
        int year;
        scanf("%d",&year);
        cout << s[(year + 6) % 10] << s1[(year + 8) % 12]<<"\n";
    }
}
题解编辑:枫_0329
题解代码:o0kangkang0o
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫_0329

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值