PAT乙级1001-1010

 

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

卡拉兹(Callatz)猜想:

对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……

我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?

输入格式:

每个测试输入包含 1 个测试用例,即给出正整数 n 的值。

输出格式:

输出从 n 计算到 1 需要的步数。

输入样例:

3

输出样例:

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

 

1002 写出这个数 (20 分)

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10​100​​。

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

1234567890987654321123456789

输出样例:

yi san wu

 

#include<iostream>
using namespace std;
int main()
{
    string str;
    cin>>str;
    int sum=0;
    int num;
    string str2;
    for(int i=0;i<str.length();i++)
    {
        num=str[i]-'0';
        sum+=num;
    }
    while(sum)
    {
        num=sum%10;
        switch(num)
        {
            case 0:
                str2+="gnil ";
                break;
            case 1:
                str2+="iy ";
                break;
            case 2:
                str2+="re ";
                break;
            case 3:
                str2+="nas ";
                break;
            case 4:
                str2+="is ";
                break;
            case 5:
                str2+="uw ";
                break;
            case 6:
                str2+="uil ";
                break;
            case 7:
                str2+="iq ";
                break;
            case 8:
                str2+="ab ";
                break;
            case 9:
                str2+="uij ";
                break;
        }
        sum/=10;
    }
    //cout<<str2;
    for(int i=str2.length()-2;i>=0;i--)
      cout<<str2[i];
    return 0;
}

1003 我要通过! (20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

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

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

输入格式:

每个测试输入包含 1 个测试用例。第 1 行给出一个正整数 n (<10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过 100,且不包含空格。

输出格式:

每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出 YES,否则输出 NO

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO

 

#include<algorithm>
#include<iostream>
#include<map>
using namespace std;
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		string str;
		map<char,int>mp;
		cin>>str;
		//pat
		int p,t;
		for(int i=0;i<str.length();i++)
		{
			mp[str[i]]++;
			if(str[i]=='P')
				p=i;
			if(str[i]=='T')
				t=i;
		}
		//Ö»ÄÜÓÐÒ»¸öPÒ»¸öT£¬ÖмäĩβºÍ¿ªÍ·¿ÉÒÔËæ±ã²åÈëA¡£
		//µ«ÊDZØÐëÂú×㿪ͷµÄAµÄ¸öÊý * ÖмäµÄAµÄ¸öÊý = ½áβµÄAµÄ¸öÊý
		//¶øÇÒPºÍTÖ®¼ä²»ÄÜûÓÐA¡«
		/*8
		PAT
		PAAT
		AApAtAA
		AAPAATAAAA*/
		if(mp.size()==3&&mp['P']==1&&mp['T']==1&&mp['A']!=0&&p-t!=1&&p*(t-p-1)==str.length()-t-1)
		{
			cout<<"YES"<<endl;
		}	
		else
			cout<<"NO"<<endl;
	}
	return 0;
}

 

1004 成绩排名 (20 分)

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:

每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
  ... ... ...
第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

Mike CS991301
Joe Math990112
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
typedef struct student
{
	string name;
	string number;
	int score;
}Student;
struct Rule
{
	bool operator()(const Student&s1,const Student&s2)
	{
		return s1.score>s2.score;
	}
};
int main()
{
	int N;
	cin>>N;
	set<Student,Rule>st;
	while(N--)
	{
		int score;
		string name;
		string number;
		cin>>name>>number>>score;
		Student S;
		S.score=score;
		S.name=name;
		S.number=number;
		st.insert(S);
	}
	set<Student>::iterator i;
	i=st.begin();
	cout<<i->name<<" "<<i->number<<endl;
	i=st.end();
	i--;
	cout<<i->name<<" "<<i->number;
	return 0;
}

1005 继续(3n+1)猜想 (25 分)

卡拉兹(Callatz)猜想已经在1001中给出了描述。在这个题目里,情况稍微有些复杂。

当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数。例如对 n=3 进行验证的时候,我们需要计算 3、5、8、4、2、1,则当我们对 n=5、8、4、2 进行验证的时候,就可以直接判定卡拉兹猜想的真伪,而不需要重复计算,因为这 4 个数已经在验证3的时候遇到过了,我们称 5、8、4、2 是被 3“覆盖”的数。我们称一个数列中的某个数 n 为“关键数”,如果 n 不能被数列中的其他数字所覆盖。

现在给定一系列待验证的数字,我们只需要验证其中的几个关键数,就可以不必再重复验证余下的数字。你的任务就是找出这些关键数字,并按从大到小的顺序输出它们。

输入格式:

每个测试输入包含 1 个测试用例,第 1 行给出一个正整数 K (<100),第 2 行给出 K 个互不相同的待验证的正整数 n (1<n≤100)的值,数字间用空格隔开。

输出格式:

每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。

输入样例:

6
3 5 6 7 8 11

输出样例:

7 6
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
set<int>st;
void n3_p1(int n)
{
	if(n==1)
	{
		return ;
	}
	if(n%2)
	{
		st.insert((3*n+1)/2);
		return n3_p1((3*n+1)/2);
	}
	else
	{
		st.insert(n/2);
		return n3_p1(n/2);
	}
}
struct Rule
{
	bool operator()(const int&a,const int&b)
	{
		return a>b;
	}
};
int main()
{
	int N;
	cin>>N;
	set<int>st1;
	set<int,Rule>st2;
	while(N--)
	{
		int number;
		cin>>number;
		st1.insert(number);
	}
	for(set<int>::iterator i=st1.begin();i!=st1.end();i++)
	{
		n3_p1(*i);
	}
	for(set<int>::iterator i=st1.begin();i!=st1.end();i++)
	{
		if(st.find(*i)==st.end())//findº¯Êý·µ»ØÒ»¸öµü´úÆ÷£¬²»ÊDz¼¶û±äÁ¿ 
			st2.insert(*i);
	}
	bool falg=true;
	for(set<int,Rule>::iterator i=st2.begin();i!=st2.end();i++)
	{
		if(falg)
			cout<<*i;
		else
			cout<<" "<<*i;
		falg=false;
	}
	return 0;
}

 

1006 换个格式输出整数 (15 分)

让我们用字母 B 来表示“百”、字母 S 表示“十”,用 12...n 来表示不为零的个位数字 n(<10),换个格式来输出任一个不超过 3 位的正整数。例如 234 应该被输出为 BBSSS1234,因为它有 2 个“百”、3 个“十”、以及个位的 4。

输入格式:

每个测试输入包含 1 个测试用例,给出正整数 n(<1000)。

输出格式:

每个测试用例的输出占一行,用规定的格式输出 n。

输入样例 1:

234

输出样例 1:

BBSSS1234

输入样例 2:

23

输出样例 2:

SS123

 

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>//reverseº¯Êý°üº¬ÔÚalgorithmº¯Êý¿âÖÐ 
using namespace std;
int main()
{
	string num;
	cin>>num;
	if(num.length()==1)
	{
		for(int i=1;i<=(num[0]-'0');i++)
			cout<<i;
	}
	else if(num.length()==2)
	{
		for(int i=0;i<num[0]-'0';i++)
			cout<<"S";
		for(int i=1;i<=num[1]-'0';i++)
			cout<<i;
	}
	else if(num.length()==3)
	{
		for(int i=0;i<num[0]-'0';i++)
			cout<<"B";
		for(int i=0;i<num[1]-'0';i++)
			cout<<"S";
		for(int i=1;i<=num[2]-'0';i++)
			cout<<i;
	}
	return 0;
}

 

1007 素数对猜想 (20 分)

让我们定义d​n​​为:d​n​​=p​n+1​​−p​n​​,其中p​i​​是第i个素数。显然有d​1​​=1,且对于n>1有d​n​​是偶数。“素数对猜想”认为“存在无穷多对相邻且差为2的素数”。

现给定任意正整数N(<10​5​​),请计算不超过N的满足猜想的素数对的个数。

输入格式:

输入在一行给出正整数N

输出格式:

在一行中输出不超过N的满足猜想的素数对的个数。

输入样例:

20

输出样例:

4
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int main()
{
	int N;
	cin>>N;
	bool isprime[N+1];
	int prime[N];
	memset(isprime,true,sizeof(isprime));
	isprime[0]=false;
	isprime[1]=false;
	int cnt=0;
	for(int i=2;i<=N;i++)
	{
		if(isprime[i])
			prime[cnt++]=i;
		for(int j=0;j<cnt&&prime[j]*i<=N;j++)
			isprime[prime[j]*i]=false;
	}
	int flag=0;
	for(int i=0;i<cnt;i++)
	{
		if(prime[i+1]-prime[i]==2)
			flag++;
		
		//cout<<prime[i]<<" ";
	}
	cout<<flag;
	return 0;
}

 

1008 数组元素循环右移问题 (20 分)

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0​​A​1​​⋯A​N−1​​)变换为(A​N−M​​⋯A​N−1​​A​0​​A​1​​⋯A​N−M−1​​)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式:

每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

输出格式:

在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4

 

#include<iostream>
using namespace std;
int main()
{
	int N,M;
	cin>>N>>M;
	int array[N];
	for(int i=0;i<N;i++)
	{
		cin>>array[i];
	}
	while(M--)
	{
		int a=array[N-1];
		for(int i=N-1;i>=1;i--)
		{
			array[i]=array[i-1];
		}
		array[0]=a;
	}
	bool flag=true;
	for(int i=0;i<N;i++)
	{
		if(flag)
			cout<<array[i];
		else
			cout<<" "<<array[i];
		flag=false;
	}
	return 0;
}

1009 说反话 (20 分)

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

输入格式:

测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。

输出格式:

每个测试用例的输出占一行,输出倒序后的句子。

输入样例:

Hello World Here I Come

输出样例:

Come I Here World Hello
#include<stdio.h>
#include<string.h>
#define N 1024
int main()
{
	char name[N];
	gets(name);
	char *p;
	p=name+strlen(name);
	while(1)
	{
		if(p==name)
		{
			printf("%s\n",p);
			break;
		}
		if(*p==' '&&*(p+1)!=' ')
		{
			*p='\0';
			printf("%s ",p+1);
		}
		p--;
	}
	return 0;
}

1010 一元多项式求导 (25 分)

设计函数求一元多项式的导数。(注:x​n​​(n为整数)的一阶导数为nx​n−1​​。)

输入格式:

以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数)。数字间以空格分隔。

输出格式:

以与输入相同的格式输出导数多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。注意“零多项式”的指数和系数都是 0,但是表示为 0 0

输入样例:

3 4 -5 2 6 1 -2 0

输出样例:

12 3 -10 1 6 0

 

#include <cstdio>
int main(){
	int a,b;
	int flag = 0;
	while(scanf("%d %d",&a,&b)!=EOF){
		if(b!=0){
			if(flag == 0)printf("%d",a*b);
			else printf(" %d",a*b);
			printf(" %d",b-1);
			flag = 1;
		}
	}
	if(flag==0)printf("0 0");
	return 0;
} 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PAT乙级1009题是一个关于字符串处理的题目。根据题目要求,我们需要将输入的字符串按照单词的逆序输出。根据提供的引用内容,我们可以看到有三种不同的解法。 引用\[1\]和引用\[2\]是两个相似的解法,使用了字符串处理函数strchr和strrchr来定位空格字符,并将字符串分割成单词。然后通过循环输出单词,最后输出剩余的最后一个单词。 引用\[3\]是另一种解法,使用了二维数组来存储每个单词。通过循环读取输入的字符串,直到遇到换行符为止。然后通过倒序循环输出每个单词。 根据题目要求,你可以选择其中一种解法来完成PAT乙级1009题。 #### 引用[.reference_title] - *1* [PAT考试乙级1009(C语言实现)](https://blog.csdn.net/JeffreyDDD/article/details/78395267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [PAT乙级1009(C语言实现)](https://blog.csdn.net/weixin_62870950/article/details/124934829)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [PAT乙级测试题1009(C语言实现)](https://blog.csdn.net/weixin_45947840/article/details/105943475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值