PAT | 计算机程序设计能力考试 https://www.patest.cn/
HelloWorld | 几句话的事儿 http://hworld.aimo.moe/
包括:3n+1猜想、挖掘机技术哪家强、找x、图形输出、日期差值、进制转换等。参见《算法笔记》第三章。备考笔记持续更新w~
PAT B1001 害死人不偿命的(3n+1)猜想
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
1
2
3
4
5
6
7
8
9
10
11
12
| #include <stdio.h>
int main(){
int n, step=0; //定义n与记步
scanf("%d",&n);
while(n!=1){ //当n不等于1时参与循环算法
if(n%2==0) n=n/2; //当n为偶数时
else n=(3*n+1)/2; //当n为奇数时
step++; //记步+1
}
printf("%d\n",step);
return 0;
}
|
PAT B1032 挖掘机技术哪家强
为了用事实说明挖掘机技术到底哪家强,PAT 组织了一场挖掘机技能大赛。现请你根据比赛结果统计出技术最强的那个学校。
输入格式:
输入在第 1 行给出不超过 10?的5次方?? 的正整数 N,即参赛人数。随后 N 行,每行给出一位参赛者的信息和成绩,包括其所代表的学校的编号(从 1 开始连续编号)、及其比赛成绩(百分制),中间以空格分隔。
输出格式:
在一行中给出总得分最高的学校的编号、及其总分,中间以空格分隔。题目保证答案唯一,没有并列。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| #include <stdio.h>
const int maxn=10010; //不超过10的5次方
int school[maxn]={0}; //定义数组存放
int main(){
int n,schID,score;
scanf("%d",&n);
for(int i=0;i<n;i++){ //循环不大于行号
scanf("%d%d",&schID,&score);
school[schID]+=score; //学校schID的总分增加score
}
int k=1,MAX=-1; //k为id,MAX为最高学校总分
for(int i=1;i<=n;i++){
if(school[i]>MAX){
MAX=school[i];
k=i;
}
}
printf("%d %d",k,MAX);
return 0;
}
|
codeup 1934 找x
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入:测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出:对于每组输入,请输出结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #include <cstdio>
const int maxn=210; //n(1<=n<=200)
int a[maxn];
int main(){
int n,x;
while(scanf("%d",&n)!=EOF){ //输入一个数n
for(int i=0;i<'n';i++){ //循环输入n个数值各不相同
scanf("%d",&a[i]);
}
scanf("%d",&x); //输入x
int k; //下标
for(k=0;k<'n';k++){ //遍历数组
if(a[k]==x){ //如果找到x
printf("%d\n",k);
break;
}
}
if(k==n){ //如果没找到x
printf("-1\n");
}
}
return 0;
}
|
PAT B1036 跟奥巴马一起编程
2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入:输入在一行中给出正方形边长 N (3<= N<= 20)和组成正方形边的某种字符 C,间隔一个空格。
输出:由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。
四舍五入可通过判断奇偶性解决。
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
| #include <cstdio.h>
int main(){
int row, col;
char c;
//行.列与要输出的字符
scanf("%d %c",&col,&c);
if(col%2==1) row=col/2+1;
else row=col/2;
//判断奇偶性
for(int i=0;i<col;i++) {printf("%c",c);} //每行的第一个a
//多少列
printf("\n");
//第二至row-1行
for(int i=2;i<row;i++){
printf("%c",c); //每行的第一个a
for(int j=0;j<col-2;j++){
printf(" "); //行-2个空格
}
printf("%c\n",c); //每行的最后一个a
}
//第row行
for(int i=0;i<col;i++){
printf("%c",c);
}
return 0;
}
|
codeup 1928 日期差值
题目描述:有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。
输入:有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD
输出:每组数据输出一行,即日期差值
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
| #include <cstdio>
int month[13][2]={ {0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31} };
//定义平年闰年每个月天数数组。
bool isLeap(int year){
return (year%4==0&year%100!=0)||(year%4==0);
}
//判断是否为闰年,四年一润百年不润四百年又润。
int main(){
int time1,y1,m1,d1;
int time2,y2,m2,d2;
while(scanf("%d%d",&time1,&time2)!=EOF){
if(time1>time2){
int temp=time1;
time1=time2;
time2=temp;
}
//如果第一个日期比第二个日期晚,就交换变量。
y1=time1/10000, m1=time1%10000/100, d1=time1%100;
y2=time2/10000, m2=time2%10000/100, d2=time2%100;
//提取ymd。
int ans=1;
//记录结果。
while(y1<y2||m1<m2||d1<d2){
d1++;
if(d1==month[m1][isLeap(y1)]+1){ //满月。
m1++;
d1=1;
}
if(m1==13){ //月份满12个月。
y1++;
m1=1;
}
ans++; //累计
}
printf("%d\n",ans); //输出。
}
return 0;
}
|
PAT B1022 D进制的A+B
题目描述:输入两个非负10进制整数A和B(<=2的30次方-1),输出A+B的D (1 < D <= 10)进制数。
输入格式:输入在一行中依次给出3个整数A、B和D。
输出格式:输出A+B的D进制数。
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
| 十进制转二进制的除基取余法:
11除2,商5,余1;
5除2,商2,余1;
2除2,商1,余0;
1除2,商0,余1。
所以11转换2进制为1101。
</pre></code>
<pre><code>
#include <cstdio>
int main(){
int a, b, d;
scanf("%d%d%d",&a,&b,&d);
int sum=a+b;
//因此得到a+b的十进制形式。
int ans[31], num=0;
ans存放D进制的每一位。
do{
ans[num++]=sum%d;
sum/=d;
}while(sum!=0);
//进制转换。
for(int i=num-1;i>=0;i--){
printf("%d",ans[i]);
}
//由高到低进行输出。
return 0;
}
|
codeup 5901 回文串
题目描述:读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
输入:一行字符串,长度不超过255。
输出:如果是回文串,输出“YES”,否则输出“NO”。
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
| #include <cstdio>
#include <cstring>
const int maxn=256;
//长度不超过255。
bool judge(char str[]){
int len=strlen(str); //字符串长度
for(int i=0;i<len/2;i++){ //i枚举字符串前一半
if(str[i]!=str[len-1-i]){ //如果对称位置不同
return false;
}
}
return true;
}
//判断字符串str是否为回文串。
int main(){
char str[maxn];
while(gets(str)){ //输入字符串
bool flag=judge(str); //判断str是否为回文串
if(flag==true){
printf("YES\n");
}else{printf("NO\n");}
}
return 0;
}
|
PAT B1009 说反话
给定一句英语,要求编写程序,将句中所有单词的顺序颠倒输出。
输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用1个空格分开,输入保证句子末尾没有多余的空格。
输出格式:每个测试用例的输出占一行,输出倒序后的句子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| #include <cstdio>
#include <cstring>
int main(){
char str[90];
gets(str);
int len=strlen(str),r=0,h=0; //r为行,h为列。
char ans[90][90]; //存放单词。
for(int i=0;i<len;i++){
if(str[i]!=' '){ //如果不是空格,则存放至ans[r][h],并令h++。
ans[r][h++]=str[i];
}else{ //如果是空格,单词结束,r+1,h=0。
ans[r][h++]='\0';
r++;
h=0;
}
}
for(int i=r;i>=0;i--){ //倒着输出单词。
printf("%s",ans[i]);
if(i>0)printf(" ");
}
return 0;
}
|
@本地磁盘姬
ohayou.aimo.moe
微博:@本地磁盘姬碟酱
Twitter:@AmyGreen
2019年03月17日