当前位置:文档之家› PAT计算机能力考试乙级1-10题答案

PAT计算机能力考试乙级1-10题答案

1001 害死人不偿命的(3n+1) 猜想(15 分对任何一个正整数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。

这样一直反复砍下去,最后一定在某一步得到 n=1。

卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3 n+1) ,以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展⋯⋯我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1?分析:输入一个正整数 n 进行循环, n=1 循环截止 , 判断 n, 如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3 n+1) 砍掉一半。

这样一直反复砍下去,最后一定在某一步得到 n=1,并计算经过的次数m。

#include"stdlib.h"#include"stdio.h"int main(){int n,m;m=0;scanf_s("%d",&n);while(n!=1){if(n%2==0){n=n/2;}else{n=(3*n+1)/2;}m++;}printf_s("%d\n",m);system("pause");}1002 写出这个数(20分)读入一个正整数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

分析:输入一个正整数n, while循环求出n的各位数字之和sum;如果 sum 等于 0,那么就输出它的拼音”ling ”;如果不等于0,输入数组 b 存放各位数字之和,在switch对这个数组进行判断数组 b 各个数的数值为多少,0 对应 "ling";1 对应 "yi";2:对应<"er";3对应"san";4对应"si";5对应"wu";6对应"liu";7对应"qi";8对应 "ba";9对应"jiu";#include<iostream>using namespace std;int main(){char a[101];cin>>a;int sum=0,i=0;while(a[i]!='\0'){sum+=a[i]-'0';++i;}if(sum==0){cout<<"ling"<<endl;}int b[11],j=0;while(sum!=0){b[j]=sum%10;sum=sum/10;++j;}for(int i=j-1;i>=0;--i){switch(b[i]){case 0:cout<<"ling";break;case 1:cout<<"yi";break;case 2:cout<<"er";break;case 3:cout<<"san";break;case 4:cout<<"si";break;case 5:cout<<"wu";break;case 6:cout<<"liu";break;case 7:cout<<"qi";break;case 8:cout<<"ba";break;case 9:cout<<"jiu";break;}if(i!=0)cout<<" ";}system("pause");return 0;}1003 我要通过!(20分)“答案正确”是自动判题系统给出的最令人欢喜的回复。

本题属于PAT 的“ 答案正确”大派送——只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“ 答案错误”。

得到“ 答案正确”的条件是:1.字符串中必须仅有 P、 A、 T 这三种字符,不可以包含其它字符;2.任意形如 xPATx 的字符串都可以获得“ 答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;3.如果 aPbTc 是正确的,那么aPbATca 也是正确的,其中a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

分析:首先判断输入的字符串必须仅有PAT p前面有0个A,pt PAAT p前面有0个A,pt AAPATAA p前面有2个A,pt AAPAATAAAA p 前面有 2 个 A,pt #include <stdio.h>#include<iostream>#include <string.h>int main(){P、 A、之间有 1个之间有 2个之间有 1个之间有 2个T 这三种字符;然后进行这样的A, T 后面有 0 个 A, 0*1=0A, T 后面有 0 个 A, 0*2=0A, T 后面有 2 个 A, 2*1=2A, T 后面有 2 个 A, 2*2=4判断:正确正确正确正确char c[100];int i,j,n;int count_P,count_A,count_T,pos_P,pos_T; scanf("%d\n" ,&n);for (i=0;i<n;i++){gets(c);count_P = 0;count_A = 0;count_T = 0;pos_P = 0;pos_T = 0;for (j=0;j<strlen(c);j++){if (c[j]=='P' ){count_P++;pos_P = j;}if (c[j]== 'A' )count_A++;if (c[j]== 'T' ){count_T++;pos_T = j;}}|| pos_T-pos_P<=1 ||count_P>1 || if (count_P+count_A+count_T != strlen(c)count_T>1 || pos_P*(pos_T-pos_P-1)!=strlen(c)-pos_T-1)printf("NO\n" );elseprintf("YES\n" );}return0;}1004 成绩排名(20分)读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

分析:首先我们需要输入学生的姓名、学号、成绩。

把他们所有的成绩作为一个整型数组,每个数与学生相对应,然后比较他们的成绩,得到最高和最低成绩。

第 i 的成绩最大或者最小,对应第 i 个学生的信息。

#include <stdio.h>#include<iostream>int main(){int i, max=0,min=0, n, score[100];char name[100][8], id[100][8];scanf( "%d",&n);for (i=0;i<n;i++){scanf( "%s%s%d",name[i], id[i], &score[i]);}for (i=0;i<n;i++)if (score[i]>score[max]) max=i;printf("%s %s\n" ,name[max],id[max]);for (i=0;i<n;i++)if (score[i]<score[min]) min=i;printf("%s %s\n" ,name[min],id[min]);system( "pause" );return0;}1005 继续 (3n+1)猜想(25 分)卡拉兹 (Callatz)猜想已经在1001 中给出了描述。

在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。

例如对n =3进行验证的时候,我们需要计算 3 、5、8、4、2、1,则当我们对=5、8、4、n2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3 的时候遇到过了,我们称 5 、8、4、2 是被 3“覆盖”的数。

我们称一个数列中的某个数n 为“关键数”,如果n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。

你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

分析:输入 n 个数,用数组 a 存放。

首先把如果碰到数组中有 0 的项,则跳过。

判断 t, 如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3 n+1) 砍掉一半。

然后进行数组中所有数与运算中出现的数比较,如果数组中有和运算过程中相同的数,就把数组中的该数改为 0。

因为输入的数组是互不相同的数,所以不会存在有多个匹配的情况,为了节省内存减少运行时间,找到有一个匹配就可跳出。

接着进行排序,然后输出。

#include <stdio.h>#include<iostream>int main(){int a[105];int n,i,t,j;scanf("%d" ,&n);for (i=0;i<n;i++){scanf("%d",&a[i]);}for (i=0;i<n;i++){t=a[i];if (t==0)continue ;while (t!=1){if (t%2==0)t/=2;else t=(3*t+1)/2;for (j=0;j<n;j++){if (a[j]==t){a[j]=0;break ;}}}}int temp;for (i=0;i<n;i++)for (j=i+1;j<n;j++){if (a[i]<a[j]){temp=a[i];a[i]=a[j];a[j]=temp;}}for (i=0;a[i]>0;i++){printf("%d%s",a[i],a[i+1]>0?" ":"" );}system( "pause" );}1006换个格式输出整数(15 分)让我们用字母B来表示“百”、字母 S表示“十”,用 12...n来表示不为零的个位数字n(<10),换个格式来输出任一个不超过 3 位的正整数。

相关主题