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

新年新气象,新年新开始

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值