您的位置:首页 > 其它

PAT(Basic Level) Practice (中文)试题源码及心得(1001~1003)

2019-02-13 16:25 190 查看

新年新气象,新年新开始

2019.2.13,距离考研发布成绩还有两天,希望会有好的结果哈。今天开始练习pat乙级试题,每天一更博客,督促自己练习,这个是试题的链接PAT(Basic Level) Practice (中文),希望大家多多指正,互相学习!NEVER GIVE UP!

1001 #害死人不偿命的(3n+1)猜想#

1001这道题就比较简单啦,这个猜想就是所有的数经过运算后都会变成1,所以问题是需要几步才会变成1。我用的是递归算法,代码如下:

#include <iostream>
using namespace std;
void Callatz(int n,int i)
{
if(n==1)
cout<< i;
else if(n%2==0){
i++;
Callatz(n/2,i);
}
else{
i++;
Callatz((3*n+1)/2,i);
}
}
int main()
{
int n,i=0;
cin>>n;
Callatz(n,i);
return 0;
}

1002 #写出这个数#

这道题也是比较简单的,只是我的算法写的比较绕,哈哈。

(1)把输入的数看成是一个个字符,然后一个个存入数组中,每存入一个字符,就减去48变成数字与sum做加法,当getchar得到的字符为空时,得到sum的值。

(2)判断sum的值是否是一位,如果是一位则代码和不是一位的代码有点小区别。把sum的值从百位到个位用switch语句判断是多少,然后相应的输出对应的英文。代码如下:

#include <stdio.h>
#include<string.h>
#include <stdlib.h>
void shuchu(int sum,int temp)
{

if (sum % 10 != sum)
{
shuchu((sum - (sum % 10)) / 10,temp);
if (sum != temp) {
switch (sum % 10) {
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;
}
}
else {
switch (sum % 10) {
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 (sum % 10 == sum)
{
switch (sum) {
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;

}
}
}
void shuchu2(int sum, int temp)
{
switch (sum % 10) {
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;
}
}

int main(int argc, char *argv[])
{
char data[100] = {0};
int sum = 0,temp = 0;
for (int i=0; i < 100 && (data[i] = getchar()) != '\n';i++)
{
sum = sum + data[i]-48;
}
temp = sum;
if (sum > 9) {
shuchu(sum, temp);
}
else
{
shuchu2(sum, temp);
}

system ("pause");
return 0;
}

1003#我要通过!#

这道题首先要读明白题,我就是开始没读明白题只能对5个测试点,剩下两个测试点。“如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。”,就是这句话要反复读明白。aPbATca ,这里a、 b、 c是指字符串,a和a要一样…例如,(AA)P(A)T(AAA)是正确的,那么(AA)P(A)AT(AAA)(AA)是正确的,那么[AA]P[AA]AT[AAAAA][AA]也是正确的,那么等等…这点比较有趣,也是需要注意的!

#include<stdio.h>
#include<string.h>
int reta(char *str)
{
int k=0,a=0;
for(k=0;str[k]!='\0';k++)
{
if(str[k]!='P' && str[k]!='A' && str[k]!='T')
return -1;
}
a=strspn(str,"A");
if(str[a]=='P')
return a;
else
return -1;
}

int retb(char *str,int a)
{
int b=0;
char *p;
p=str+a+1;
b=strspn(p,"A");
if(p[b]=='T')
return b;
else
return -1;
}

int retc(char *str,int a,int b)
{
int c=0;
char *p;
p=str+a+b+2;
c=strspn(p,"A");
if(p[c]=='\0')
return c;
else
return -1;
}

int main(int argc, char *argv[])
{
int n=0,i=0,j=0,a=0,b=0,c=0,r[10]={0};
char str[10][100];
scanf("%d",&n);
for(i=0;i<n && i<10;i++)
scanf("%s",str[i]);

for(i=0;i<n && i<10;i++)
{
a=reta(str[i]);
if(a!=-1)
b=retb(str[i],a);
else
continue;
if(b!=-1)
c=retc(str[i],a,b);
else
continue;
if(b>0 && c==b*a)
r[i]=1;
}

for(i=0;i<n && i<10;i++)
{
if(r[i]==0)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: