「PAT乙级真题解析」Basic Level 1005 继续(3n+1)猜想 (问题分析+完整步骤+伪代码描述+提交通过代码)
创始人
2024-02-19 02:35:00
0

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1005 继续(3n+1)猜想

问题分析

题目提出一个新概念"关键数", 并给出其定义: 在进行(3n+1)猜想时, 不会出现在其他给定数值的计算过程中的, 就是关键数。
这意味着, 如果我们要计算给定的一组数中, 哪些数是关键数, 则需要对这些数进行(3n+1)猜想的计算,
然后记录计算过程中出现的各个数, 等到完全计算完毕后与给定的数值进行对比, 得到差异即可。

统计出现过的数值

  1. 不能记录最初输出的数值本身。由于关键数是说没有出现在其他数的计算过程中, 所以不包括起始数值本身。
  2. 鉴于第1点, 所以需要先计算(3n+1)猜想的下一个值, 然后记录该该值。
  3. 如果下一个值已经被计算过了, 那么由下一值能够覆盖的数也都应该被计算过了, 这时可以直接break;

完整描述步骤

  1. 获取输入: 数值个数, 各个数值
  2. 初始化统计器:
    • 该数字已经被计算过的标志位 = {False}
  3. 对于每一个数值:
    • 进行(3n+1)猜想, 记录除了数值本身之外出现的数(标志位置为1);
  4. 将所有数值逆序排列
  5. 依次检查每一个数值:
    • 如果该数值的标记位为False:
      • 输出该数值

伪代码描述

  1. get input: number_amount, numbers;
  2. init recorder:
    • calculated[10000] = {False}
  3. for number in numbers:
    • while number != 1:
      • if number % 2 == 1:
        • number = number * 3 + 1;
      • number = number / 2;
      • calculated[number] = True;
  4. sort numbers descendingly
  5. for number in sorted(numbers):
    • if calculated[number] == False:
      • print(number)

注意事项

  1. 题设给定的正整数的取值范围应该是(1, 10000], 所以calculated的个数应该设置为5001及以上。
    • 不然测试点3和测试点4会段错误

完整提交代码

/*
# 问题分析
题目提出一个新概念"关键数", 并给出其定义: 在进行(3n+1)猜想时, 不会出现在其他给定数值的计算过程中的, 就是关键数。
这意味着, 如果我们要计算给定的一组数中, 哪些数是关键数, 则需要对这些数进行(3n+1)猜想的计算,
然后记录计算过程中出现的各个数, 等到完全计算完毕后与给定的数值进行对比, 得到差异即可。## 统计出现过的数值
1. 不能记录最初输出的数值本身。由于关键数是说没有出现在其他数的计算过程中, 所以不包括起始数值本身。
2. 鉴于第1点, 所以需要先计算(3n+1)猜想的下一个值, 然后记录该该值。
3. 如果下一个值已经被计算过了, 那么由下一值能够覆盖的数也都应该被计算过了, 这时可以直接break;# 完整描述步骤
1. 获取输入: 数值个数, 各个数值
2. 初始化统计器:- 该数字已经被计算过的标志位 = {False}
3. 对于每一个数值:- 进行(3n+1)猜想, 记录除了数值本身之外出现的数(标志位置为1);
4. 将所有数值逆序排列
5. 依次检查每一个数值:- 如果该数值的标记位为False:- 输出该数值# 伪代码描述
1. get input: number_amount, numbers;
2. init recorder:- calculated[10000] = {False}
3. for number in numbers:- while number != 1:- if number % 2 == 1:- number = number * 3 + 1;- number = number / 2;- calculated[number] = True;
4. sort numbers descendingly
5. for number in sorted(numbers):- if calculated[number] == False:- print(number)# 注意事项
1. 题设给定的正整数的取值范围应该是(1, 10000], 所以calculated的个数应该设置为5001及以上。- 不然测试点3和测试点4会段错误
*/# includeint cmp(const void *a, const void *b){return *(int*)b - *(int*)a;
}int main(){int calculated[10000] = {0};int number_amount;scanf("%d", &number_amount);int numbers[number_amount], number;for (int i = 0; i < number_amount; i++){scanf("%d", &number);numbers[i] = number;while (number != 1){if (number % 2 == 1){number = number * 3 + 1;}number = number / 2;if (calculated[number] == 1){break;}calculated[number] = 1;}}int first_element_printed = 0;qsort(numbers, number_amount, sizeof(int), cmp);for (int i = 0; i < number_amount; i++){if (calculated[numbers[i]] == 0){if (first_element_printed){printf(" ");}printf("%d", numbers[i]);first_element_printed = 1;}}return 0;
}

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...