7-1 建校日期

直接输出2025-01-11

1
2
3
4
5
#include<iostream>
using namespace std;
int main(){
cout << "1921-10-18" << "\n"; //相当于c语言printf("1921-10-18\n");
}

7-2 精准打击

很简单就是计算圆面积,需要注意保留两位小数(输出时只输出小数点后两位)

1
2
3
4
5
6
7
8
9
#include<iostream>
#define PII 3.14
using namespace std;
double R,S;
int main(){
cin >> R;
S = R*R*PII;
printf("%.2lf",S);
}

7-3 小孩子才做选择,大人全都要

有题意可知:

假设两个盲盒中的狗粮或储蓄盒容量分别为c1,c2

阿汪只会在两个盲盒之间选择1个有狗粮且狗粮最多的一个。则让阿汪选能吃到的狗粮 A=max(0,c1,c2)

铲屎官会两个盲盒都要,则铲屎官全都要能吃到的狗粮 B=max(0,c1+c2)

1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>
using namespace std;
int c1,c2,a,b;
int main(){
cin >> c1 >> c2;
a=max(0,max(c1,c2));
b=max(0,c1+c2);
cout << a << ' ' << b << endl;
if(b>a) cout << "^_^";
else if(b<a) cout << "T_T";
else cout << "-_-";
}

7-4 比较大小

将a,b,c三个数排序一下输出即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
using namespace std;
int a,b,c,temp;
int main(){
cin >> a >> b >> c;
if(a>b){
temp = a;
a = b;
b = temp;
}
if(b>c){
temp = b;
b = c;
c = temp;
}
if(a>b){
temp = a;
a = b;
b = temp;
}
cout << a << "->" << b << "->" << c << endl;
}
-----或者----------------------------------------------------------
#include <bits/stdc++.h>
using namespace std;
int arr[3],temp;
int main(){
for(int i=0;i<3;i++) cin >> arr[i];
sort(arr,arr+3);
cout << arr[0] << "->" << arr[1] << "->" << arr[2] << endl;
}

7-5 查找整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
int n,x,flag;
int arr[21];
int main(){
scanf("%d %d",&n,&x);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<n;i++){
if(arr[i]==x){
printf("%d",i);
flag=1;
}
}
if(!flag) printf("Not Found");
}

7-6 念数字

首先是选择合适的数据类型存储输入的整数,可以用字符串或整形存储,然后利用一一对应关系输出。

这个题用c++的map容器就很方便。

1
2
3
4
5
6
7
8
9
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
-------c语言以字符串存数据---------
#include <stdio.h>
char str[5];
int main(){
scanf("%s",str);
int i=0;
while(str[i]!='\0'){
switch(str[i]){
case '-':printf("fu");break;
case '0':printf("ling");break;
case '1':printf("yi");break;
case '2':printf("er");break;
case '3':printf("san");break;
case '4':printf("si");break;
case '5':printf("wu");break;
case '6':printf("liu");break;
case '7':printf("qi");break;
case '8':printf("ba");break;
case '9':printf("jiu");break;
}
if(str[++i]!='\0') printf(" ");
}
}
-------c语言以整型存数据---------
#include <stdio.h>
int a;
int main(){
scanf("%d",&a);
if(a<0){
printf("fu ");
a = -a;
}
int mask=1;
int t=a;
while(t>9){
t/=10;
mask*=10;
}
do{
int b=a/mask;
switch(b){
case 0:printf("ling");break;
case 1:printf("yi");break;
case 2:printf("er");break;
case 3:printf("san");break;
case 4:printf("si");break;
case 5:printf("wu");break;
case 6:printf("liu");break;
case 7:printf("qi");break;
case 8:printf("ba");break;
case 9:printf("jiu");break;
}
if(mask>9)printf(" ");
a%=mask;
mask/=10;
}while(mask>0);
}
-------c++用map容器-----------
#include <iostream>
#include <map>
#include <string>
using namespace std;
string str;
map<char,string> numToPinyin = {
{'-', "fu"},
{'0', "ling"},
{'1', "yi"},
{'2', "er"},
{'3', "san"},
{'4', "si"},
{'5', "wu"},
{'6', "liu"},
{'7', "qi"},
{'8', "ba"},
{'9', "jiu"}
};
int main(){
cin >> str;
for(int i=0;i<str.size();i++){
if(i!=0) cout << ' ';
cout << numToPinyin[str[i]];
}
}

7-7 古风排版

先输入行数r,在输入字符串str,注意要用getchar();清除缓存区中的回车,用gets(str);获取带空格的字符串

用字符串的长度除以行数r计算出列数l(注意判断是否除尽,若未除尽向上加1)

将排版好的内容看作是一个二维数组,则对于“This is a test case”有

标号 1 2 3 4 5
1 a s a T
2 s t i h
3 e t s i
4 c e s

可以看出第i行j列的字符对应str中第(l-j)*r+i个字符,str从0开始标号则需要再减1

这个题重点就是:先得到排版后的行列数,然后找到映射关系

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
int r,l,n;
char str[1005];
int main(){
scanf("%d",&r);
getchar();
gets(str);
n=strlen(str);
l=n/r;
if(n%r>0) l++;
for(int i=1;i<=r;i++){
for(int j=1;j<=l;j++){
if((l-j)*r+i>n) printf(" ");
else printf("%c",str[(l-j)*r+i-1]);
}
printf("\n");
}
}

7-8 N个数求和

先将所以数的分子分母存入两个数组。然后两数两数通分相加,相加后计算公约数约分。

1
2
3
4
5
6
7
8
9
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
#include <stdio.h>
int gcd(int m,int n);

int main(int argc, char** argv) {
int N;
scanf("%d", &N);
int i,a[N],b[N];
int x,y,c,d,m,n;//x为分子,y为分母
//读取分数
for (i = 0; i < N; i++) {
scanf("%d/%d", &a[i], &b[i]);
}
//通分
x = a[0];
y = b[0];
for (i = 1; i < N; i++) {
x = x * b[i] + a[i] * y;//通分后分子大小
y *= b[i]; //通分后分母大小

c = gcd(x, y); //最大公约数
if(c!=0){
x /= c;//化简后分子
y /= c;//化简后分母
}
}
if(x == 0 && y != 0){
printf("0");
}else{
d = x/y;//求整数部分
x %= y;//求分数部分

if (d != 0 && x != 0) {
printf("%d %d/%d", d, x, y);
}
else if (d != 0 && x == 0) {
printf("%d", d);
}
else {
printf("%d/%d",x, y);
}
}
return 0;
}
//求最大公约数
int gcd(int m,int n)
{
while (n) {
int t = n;
m %= n;
n = m;
m = t;
}
return m;
}

7-9 谁管谁叫爹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
int n,sa,sb,na,nb;
int fun(int x){ // 定义函数fun计算整数x各位相加的结果
int y=0;
while(x){
y+=x%10;
x/=10;
}
return y;
}
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d %d",&na,&nb);
sa=fun(na);
sb=fun(nb);
if(na%sb==0&&nb%sa!=0) printf("A\n");
else if(na%sb!=0&&nb%sa==0) printf("B\n");
else{
if(na>nb) printf("A\n");
else printf("B\n");
}
}
}

7-10 换硬币

假零钱额数为x,其中5分硬币的数量 i 可取的情况有(x-3)/5种,减3是因为题目说每种硬币至少有一枚,则2分硬币的数量 j 可取的情况有(x-i*5-1)/2种,1分硬币的数量为 x-5i-2j

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
int x,cnt;
int main(){
scanf("%d",&x);
for(int i=(x-3)/5;i>=1;i--){
for(int j=(x-i*5-1)/2;j>=1;j--){
int z=x-i*5-j*2;
printf("fen5:%d, fen2:%d, fen1:%d, total:%d\n",i,j,z,i+j+z);
cnt++;
}
}
printf("count = %d",cnt);
}