PAT乙级1001- 1005 题解报告

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

题目链接

题意

求一个数经过题中操作变为1的步数

思路

1.判断是偶数还是奇数

坑点

1.无

代码 

#include<iostream>
#include<algorithm> 
using namespace std;
int n,cnt=0;//n一个数,cnt计算步数 
int main()
{
	cin>>n;//输入这个数 n 
	while(n!=1)//当n!=1时进入循环 
	{
		if(n%2==0)//是偶数时 
		{
			n/=2;//进行n/2的操作 
			cnt++;//步数++ 
		}
		else//是奇数时 
		{
			n=(3*n+1)/2;//进行此操作 
			cnt++;//步数++ 
		}
	}
	cout<<cnt;//输出步数 
	return 0;
}

总结

难度简单,while循环,if判断

B - 1002 写出这个数 

题目链接

题意

1.用汉字拼音写出每一位数

 思路

1.将数转换为拼音字符串
2.遍历求和  

 

坑点

1.输出的个位数字后不含空格
2.数的范围很大,开longlong也不够

代码

​
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
    string s;//数的范围太大需要用到字符串 
    int sum=0,j=0;//sum计算所有数的和,j表示sum一共几位 
    cin>>s;//用字符串来读入数 
    int f[1000];//存储各位的数 
    string a[10];//定义一个字符串数组存储 0-9 各个数字对应的拼音 
    a[0]="ling";
    a[1]="yi";
    a[2]="er";
    a[3]="san";
    a[4]="si";
    a[5]="wu";
    a[6]="liu";
    a[7]="qi";
    a[8]="ba";
    a[9]="jiu";
    for(int i=0;i<s.length();i++)
    {
        sum+=s[i]-'0';//转换成字符 
    }
    while(sum>0)
    {
        f[j]=sum%10;//最先计算出个位 
        j++;//计算几次 %操作,也就是计算是一个几位数 
        sum=sum/10;
    }
    for(int i=j-1;i>0;i--)//倒序输出 
    {
        cout<<a[f[i]]<<" ";//输出除去个位的各个数 
    }
    cout<<a[f[0]];//最后输出个位上的数 
}

​

总结

难度中等,对于字符串与数字之间的转换掌握较差,循环

 C - 1003 我要通过!

题目链接

题意

判断字符串是否符合题中规则

思路 

1.找到规律

坑点 

1.无

代码 

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring> 
#include<map>
using namespace std;
int n,p=0,t=0;
string s; 
int main()
{
	cin>>n;//n组数据 
	for(int i=0;i<n;i++)
	{
		cin>>s;//读入该字符 
		map<char,int>mp;//存储字符 
		for(int j=0;j<s.size();j++)
		{
			mp[s[j]]++;//存储不同的字符出现了几次 
			if(s[j]=='P')//当字符==P时 
			{
				p=j;//用p来标记P出现的位置 
			}
			if(s[j]=='T')//当字符等于T时 
			{
				t=j;//用t来标记T出现的位置 
			}
		} 
		if(mp['P']==1&&'A'!=0&&mp['T']==1&&mp.size()==3&&t-p!=1&&p*(t-p-1)==s.length()-t-1)
		//规则为 P,T只出现一次,不能不含A,字符串内不同字符数量只能为 3,
		//T出现的位置的下标减去P出现的位置的下标不可能等于1; T-P位置的下标之前的长度*2=T位置后面的长度 
		{
			printf("YES\n");//符合规则,输出YES 
		}
		else{
			printf("NO\n");//不符合规则,输出NO 
		}
	}
	return 0;
}

总结

难度中等,思维较差,题意花很长时间才看懂,需熟练掌握map函数

D - 1004 成绩排名

题目链接

题意

1.分别输出最高和最低成绩学生的姓名和学号

思路 

1.输入多组学生的姓名、学号、成绩

2.按成绩进行排序

坑点 

1.无

代码 

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
struct name{
	string xm;//姓名
	string xh;//学号
	int cj;//成绩 
}a[10005];//用数组a来存储 
bool cmp(name x,name y)
{
	return x.cj>y.cj;//成绩高的排在前面 
}
int main()
{
	cin>>n;//输入n组 
	for(int i=0;i<n;i++)//遍历输入每组的姓名,学号,成绩 
	{
		cin>>a[i].xm>>a[i].xh>>a[i].cj;
	}
	sort(a,a+n,cmp);//用上面结构体中的进行排序 
	cout<<a[0].xm<<" "<<a[0].xh<<endl;//先输出第一名的姓名和学号 
	cout<<a[n-1].xm<<" "<<a[n-1].xh; //最后输出最后一名的姓名和学号 
	return 0;
}

总结

难度简单,结构体排序

E -  1005 继续(3n+1)猜想

题目链接

题意

从大到小输出关键数

思路 

1.输入k个数

2.找到关键数

3.从大到小输出

坑点 

1.输出的最后一个数后没有空格

代码 

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
	return a>b;//降序 
}
int main()
{
	int K,flag=0;	
	cin>>K;//K个数 
	int a[10000]={0};
	vector<int> v;
	for(int i=0;i<K;i++)
	{
		int tmp;//读入这些数	
		cin>>tmp;
		v.push_back(tmp) ;//将这些数插入到 v 中 
		while(tmp!=1)//不等于1时 
		{
			if(tmp%2==1)//为奇数时 
			{
				tmp=3*tmp+1;
			}
			if(tmp%2==0)//为偶数时 
			{
				tmp/=2;
			}
			if(a[tmp]==0)//不被包含 
			{
				a[tmp]=1;//赋值为1 ,做标记 
			}
		}
	}
	sort(v.begin() ,v.end() ,cmp);//排序 
	for(int i=0;i<v.size() ;i++)//遍历 
	{
		if(a[v[i]]==0)//不被包含 
		{
			if(flag==1)//状态为1时 
			{
				cout<<" ";//可以避免最后一个数后有空格 
			}	
			cout<<v[i];//输出找到的数 
			flag=1; 	
		}
	}
	return 0;
} 

总结

难度较难,题目花很长时间才看懂,需提高思维能力,对于vector的用法不熟悉,需熟练掌握vector的用法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值