shell练习--PAT题目1005:继续(3n+1)猜想(全绿失败喜加一)
卡拉兹(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 (<),第 2 行给出 K 个互不相同的待验证的正整数 n (1)的值,数字间用空格隔开。
输出格式:
每个测试用例的输出占一行,按从大到小的顺序输出关键数字。数字间用 1 个空格隔开,但一行中最后一个数字后没有空格。
输入样例:
6
3 5 6 7 8 11
输出样例:
7 6
分析:
1.应该可以用关联数组的值判断是否为最小值。
2.要理解覆盖关系的问题,可以用1001的脚本分别跑一下这几个数字,就可以发现,对于 3 5 6 8 来说,存在一个包含与被包含的关系:6 → 3 → 5 → 8,对于7 11而言,存在 7 → 11的关系。
那么可以通过判断数字n是不是在上一个数字的数组里面可以判断是否存在覆盖的问题。
初步思路为:
1.按照1001示例中,将每个数值的结果存入关联数组中;
2.当存在值的覆盖时,对于关联数组中该值的数值+1;
3.判断关联数组中,所有值为1的数值;
4.将步骤3中的数值,与输入数组的值,当存在步骤三,且存在输入值时,判断输出。
wyf349@ubuntu:~/user/study_shell$ ./1005.callatz.err1.sh #增加一个数组存放中间值,打印
input n:3
5 8 4 2 1
wyf349@ubuntu:~/user/study_shell$ ./1005.callatz.err1.sh
input n:5
8 4 2 1
wyf349@ubuntu:~/user/study_shell$ ./1005.callatz.err1.sh
input n:6
3 5 8 4 2 1
wyf349@ubuntu:~/user/study_shell$ ./1005.callatz.err1.sh
input n:8
4 2 1
具体代码如下,目前尚未通过:
随机了1-100的随机数,和其他人通过的C语言,python的结果比对一致,不知道异常案例的情况下,也没有太好的思路。
运行超时是一定的了。
#/bin/bash
#校验Callatz规则
func_check(){
if [ `expr $n % 2` -eq 0 ]
then
n=`echo "$n/2" |bc `
else
n=`echo "((3*$n)+1)/2" |bc `
fi
} read number
read str #输入字符组,此处没有解决多行直接输入问题,使用-d参数可以多行,但需要指定结束符,索性忽略首行
arr_tmp=($str)
if [ $number -gt 0 -a $number -le 100 ] && [ ${#arr_tmp[@]} -eq $number ] && [ $number -gt 1 ]
then
pass
else
echo "输入不满足条件,请检查输入值!"
exit 1
fi declare -A arr_n #定义关联数组 arr_n for n in $(echo $str)
do
if [ $n -gt 0 -a $n -lt 100 ];then pass ;else exit && exit 1;fi 2>/dev/null
arr=($n) #把输入作为第一个元素
i=1
while [ $n != 1 ]
do
func_check
arr[$i]=$n
let i++
done
#echo ${arr[@]}
for j in ${arr[@]}
do
let arr_n[$j]++ #统计关联数组的个数,相同的自增
done
done list_tmp=''
for arr_title in ${!arr_n[@]}
do
echo $str |grep -wq $arr_title #判断数字是否在输入数字中
if [ $? -eq 0 ]
then
list=$(echo ${arr_title} ${arr_n[${arr_title}]} |awk '{if($2==1) print $1}')
list_tmp="$list_tmp $list"
fi done
list_tmp=(`echo $list_tmp | tr ' ' '\n' |sort -n -r |tr '\n' ' '`)
echo ${list_tmp[@]}
python的方法(相同思路通过),但是不简洁,新增了很多列表
def callate2(x): #定义一个函数计算callate的值的列表
list_tmp1=[]
list_tmp1.append(x)
while x != 1 :
if x % 2 == 0:
x = x / 2
else:
x = (3 * x + 1) / 2
list_tmp1.append(int(x))
return list_tmp1 n = int(input())
list=[int(x) for x in input().split()]
new_list=[] for i in list:
a = callate2(i)
new_list.append(a)
new_list_1=[]
for i in range(len(new_list)): #解包,将列表new_list中的元素解包
for j in range(len(new_list[i])):
new_list_1.append(new_list[i][j]) new_dict={}
for x in new_list_1:
new_dict[x]=new_list_1.count(x) list_a=[] #筛选元素为1的值
for k,v in new_dict.items():
if v == 1 :
list_a.append(k) set_a=set(list_a).intersection(set(list)) #集合的方法,交集
list_b=[x for x in set_a]
list_b.sort() #排序,sort方法直接修改原列表,不产生新的对象。
list_b.reverse()
print(' '.join(str(x) for x in list_b)) #join方法前提是元素为字符串形式
shell练习--PAT题目1005:继续(3n+1)猜想(全绿失败喜加一)的更多相关文章
- PAT 乙级 1005. 继续(3n+1)猜想 (25)
1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情 ...
- PAT乙级 1005. 继续(3n+1)猜想 (25)
1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz ...
- [C++]PAT乙级1005. 继续(3n+1)猜想 (25/25)
/* 1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推 ...
- PAT 乙级 1005 继续(3n+1)猜想 (25) C++版
1005. 继续(3n+1)猜想 (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Callatz ...
- 【PAT】1005. 继续(3n+1)猜想 (25)
1005. 继续(3n+1)猜想 (25) 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中 ...
- PAT 乙级 1005.继续(3n+1)猜想 C++/Java
1005 继续(3n+1)猜想 (25 分) 题目来源 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记 ...
- PAT(B) 1005 继续(3n+1)猜想(Java)
题目链接:1005 继续(3n+1)猜想 分析 找出所有的被"覆盖"的数,然后再将输入的数中不在被"覆盖"的数中的数添加到"关健数"中.输 ...
- shell练习--PAT题目1001:卡拉兹(Callatz)猜想(失败案例)
卡拉兹(Callatz)猜想: 对任何一个正整数 n,如果它是偶数,那么把它砍掉一半:如果它是奇数,那么把 ( 砍掉一半.这样一直反复砍下去,最后一定在某一步得到 n=1.卡拉兹在 1950 年的世界 ...
- PAT 乙级 -- 1005 -- 继续(3n+1)猜想
题目简述 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如 ...
随机推荐
- 【HANA系列】SAP HANA跟我学HANA系列之创建计算视图一
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA跟我学HANA系 ...
- ps和top进程监控
一.名词解释 1.什么是进程(what is process)? 答:进程是程序运行的过程,伴有动态,生命和运行状态.(组成:1.已分配内存的地址空间 2.安全属性,包括所有权凭据和特权 3.程序 ...
- word2vec高效训练方法
在word2vec原理中讲到如果每个词向量由300个元素组成,并且一个单词表中包含了10000个单词.回想神经网络中有两个权重矩阵——一个在隐藏层,一个在输出层.这两层都具有300 x 10000 = ...
- USACO3.3 A Game【区间dp】
这道题也是一道非常有意思的区间$dp$,和在纪中的这道题有点像:取数游戏 (除了取数规则其它好像都一样诶) 当时在纪中的时候就觉得这个$dp$非常不好想,状态定义都不是很容易想到. 但是做过一道这种题 ...
- USACO2.1 Hamming Codes【枚举+二进制处理+输出格式+题意理解】
这道题加了2个看起来奇奇怪怪的$tag$ 1.输出格式:不得不说这个格式输出很恶心,很像$UVA$的风格,细节稍微处理不好就会出错. 因为这个还$WA$了一次: ,m=n; ) { ;i<=t+ ...
- 【miscellaneous】网络摄像机
自20世纪90年代初期网络摄像机开始诞生,产业已历经20余年的演变. "IP大时代"的口号在安防领域已响彻已久,但也是自2015年至今才开使有了真正的底气.当全面超越模拟已尘埃落定 ...
- layer最大话.最小化.还原回调方法
layer.open({ type: 1, title: ‘在线调试‘, content: ‘这里是内容‘, ...
- netcore 实现一个简单的Grpc 服务端和客户端
参考资料,和详细背景不做赘述. 首先定义prop 文件 syntax ="proto3"; package RouteGrpc; service HelloWorld{ rpc S ...
- 【Android Apk重新签名报错re-sign.jar之解决方法】
故障现象:
- Shell 变量详解教程之位置变量与预定义变量
Shell 变量分为3部分,分别是用户自定义变量.位置变量和预定义变量. 一. 自定义变量 那么,什么是变量呢?简单的说,就是让某一个特定字符串代表不固定的内容,用户定义的变量是最普通的Shell ...