1001 害死人不偿命的(3n+1)猜想 (15 分)
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。卡拉兹在 1950 年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,一心只证 (3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……
我们今天的题目不是证明卡拉兹猜想,而是对给定的任一不超过 1000 的正整数 n,简单地数一下,需要多少步(砍几下)才能得到 n=1?
输入格式:
每个测试输入包含 1 个测试用例,即给出正整数 n 的值。
输出格式:
输出从 n 计算到 1 需要的步数。
输入样例:3
输出样例:5
代码
1 |
|
1002 写出这个数 (20 分)
读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
输入格式:
每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10^100
输出格式:
在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。
输入样例:1234567890987654321123456789
输出样例:yi san wu
代码
1 |
|
1004 成绩排名 (20 分)
读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。
输入格式:
每个测试输入包含 1 个测试用例,格式为
第 1 行:正整数 n
第 2 行:第 1 个学生的姓名 学号 成绩
第 3 行:第 2 个学生的姓名 学号 成绩
… … …
第 n+1 行:第 n 个学生的姓名 学号 成绩
其中姓名
和学号
均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出格式:
对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。
输入样例:
1 | 3 |
输出样例:
1 | Mike CS991301 |
代码
1 | //用结构体来存储每位学生的信息,用一个结构体指针来指向一个结构体数组。 |
1 | 下面是优化之后的代码 |
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 个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
1 | 6 |
输出样例:7 6
代码
基本思想:对每一个输入的数字i进行验证,把验证过的数字对应的b[i]标记为1,所有b[i]=-1的数字即为关键数字,所有b[i] = 0的数字代表本次测试未曾用到。最后对关键数字数字从大到小进行输出。
b的数组长度必须要设定的很大,因为3n+1时候可能会出现数组越界的情况
1 |
|
这里给出柳婼 の blog姐姐的解法,其中向量(vector)一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
sort是库algorithm中的一个函数
本题重点就是一方面是想到桶排序的思想,另一方面是注意到b的数组长度需要很大。
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
代码
过于简单,不加详述
1 |
|
1007 素数对猜想 (20 分)
让我们定义$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
代码
1 |
|
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位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
1 | 6 2 |
输出样例:5 6 1 2 3 4
代码
1 | //分析:数组的循环右移,可以用逆序数组的组合来实现,因为数组长度最大只有100,所有可以直接使用顺序表进行操作 |
1009 说反话 (20 分)
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
输入样例:Hello World Here I Come
输出样例:Come I Here World Hello
代码
1 | //分析,定义一个字符数组用于存储字符串,用游标i指向数组的最后一个字符,依次向前遍历,当遇到空格或者起点时,将刚才遍历的字符从前向后///用游标j取出。 |
这里给出柳婼 の blog姐姐的解法,用到了栈,使问题简化,但用的cin,不理解为什么可以通过。
这里对于这个问题做出解答。
cin
是没有返回值,问题在于>>
输入操作符,应该考虑的是它返回了什么- “
>>
”操作重载函数istream& operator>>(istream&, T &);
的返回值,其中第二个参数由cin>>
后续参数类型决定。其返回值类型为istream&
类型,大多数情况下其返回值为cin
本身(非0值),只有当遇到EOF输入时,返回值为0。所以会有这种cin
连续读取的方法。当输入所有数据后,通过输入EOF
的方法,可以退出while(cin>>a)
这样的循环。 - 输入
EOF
的方法,windows下输入ctrl+z
, Linux下输入ctrl+d
。 cin
是不接收空格的,空格作为其分界符。当cin
读取到空格时,cin
会从缓冲区读出,但却不会被cin
接收到字符串当中去。
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
代码
1 | //此题比较简单,只需注意当输入是常数多项式的情况即可,还要注意给出的是所有非零项系数 |
下面给出**柳婼 の blog姐姐**的解法,不需要数组存储,节省了空间。
1 |
|
1011 A+B 和 C (15 分)
给定区间$[{−2}^{31},2^{31}]$内的3个整数$A、B$和$C$,请判断$A+B$是否大于$C$。
输入格式:
输入第 1 行给出正整数 T (≤10),是测试用例的个数。随后给出 T 组测试用例,每组占一行,顺序给出 A、B 和 C。整数间以空格分隔。
输出格式:
对每组测试用例,在一行中输出 Case #X: true 如果 A+B>C,否则输出 Case #X: false,其中 X 是测试用例的编号(从 1 开始)。
输入样例:
1 | 4 |
输出样例:
1 | Case #1: false |
代码
1 | //分析:可以用队列来暂存需要用到的数字,需要注意的是,要用long int |
下面给出柳婼 の blog姐姐的解法,和我一开始所想一致,但是担心控制台误判,未曾采用。
1012 数字分类 (20 分)
给定一系列正整数,请按要求对数字进行分类,并输出以下 5 个数字:
- $A_1$ = 能被 5 整除的数字中所有偶数的和;
- $A_2$ = 将被 5 除后余 1 的数字按给出顺序进行交错求和,即计算 $n_1−n_2+n_3−n_4⋯$;
- $A_3$ = 被 5 除后余 2 的数字的个数;
- $A_4$ = 被 5 除后余 3 的数字的平均数,精确到小数点后 1 位;
- $A_5$ = 被 5 除后余 4 的数字中最大数字。
输入格式:
每个输入包含 1 个测试用例。每个测试用例先给出一个不超过 1000 的正整数 N,随后给出 N 个不超过 1000 的待分类的正整数。数字间以空格分隔。
输出格式:
对给定的 $N$ 个正整数,按题目要求计算 $A_1$~$A_5$并在一行中顺序输出。数字间以空格分隔,但行末不得有多余空格。
若分类之后某一类不存在数字,则在相应位置输出 N
。
输入样例 1:13 1 2 3 4 5 6 7 8 9 10 20 16 18
输出样例 1:30 11 2 9.7 9
输入样例 2:8 1 2 4 5 6 7 9 16
输出样例 2:N 11 2 N 9
代码
1 |
|
下面给出柳婼 の blog姐姐的解法,只是她用到了类似数组的C++ Vectors,占用了更大的空间。
1013 数素数 (20 分)
令 $P_i$表示第 i 个素数。现任给两个正整数 $M≤N≤10^4$,请输出 $P_M$到 $P_N$的所有素数。
输入格式:
输入在一行中给出 $M$ 和 $N$,其间以空格分隔。
输出格式:
输出从 $P_M$到 $P_N$的所有素数,每 10 个数字占 1 行,其间以空格分隔,但行末不得有多余空格。
输入样例:5 27
输出样例:
1 | 11 13 17 19 23 29 31 37 41 43 |
代码
1 |
|
下面给出柳婼 の blog姐姐的解法,只是她用到了类似数组的C++ Vectors,占用了更大的空间
1014 福尔摩斯的约会 (20 分)
大侦探福尔摩斯接到一张奇怪的字条:
1 | 我们约会吧! |
大侦探很快就明白了,字条上奇怪的乱码实际上就是约会的时间星期四 14:04
,因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母 D
,代表星期四;第 2 对相同的字符是 E
,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 23 点由数字 0 到 9、以及大写字母 A
到 N
表示);后面两字符串第 1 对相同的英文字母 s
出现在第 4 个位置(从 0 开始计数)上,代表第 4 分钟。现给定两对字符串,请帮助福尔摩斯解码得到约会的时间。
输入格式:
输入在 4 行中分别给出 4 个非空、不包含空格、且长度不超过 60 的字符串。
输出格式:
在一行中输出约会的时间,格式为 DAY HH:MM
,其中 DAY
是某星期的 3 字符缩写,即 MON
表示星期一,TUE
表示星期二,WED
表示星期三,THU
表示星期四,FRI
表示星期五,SAT
表示星期六,SUN
表示星期日。题目输入保证每个测试存在唯一解。
输入样例:
1 | 3485djDkxh4hhGE |
输出样例:THU 14:04
代码
1 |
-------------本文结束感谢您的阅读-------------
本文链接: http://corner430.github.io/2022/03/05/PAT%E5%88%B7%E9%A2%98/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
