zoukankan      html  css  js  c++  java
  • shell练习--PAT题目1001:卡拉兹(Callatz)猜想(失败案例)

    卡拉兹(Callatz)猜想:

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

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

    输入格式:

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

    输出格式:

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

       

    好久没有写shell的脚本了,然后再pat上找题目学习,练练手,各种问题。

    read -p "input n:" n
    if [ $n -gt 0 -a $n -lt 1000 ]
    then
            echo "$n is right"
            n1=$n
    else
            echo "$n is error"  
            exit
    fi
    
    i=0
    while [ $n != 1 ] 
    do
            if [ `expr $n % 2` -eq 0 ]
            then
                    n=`echo "$n/2" |bc `
            else
                    n=`echo "((3*$n)+1)/2" |bc `
            fi
            let i+=1
    done
    echo "计算输入n值,当n=${n1}时,共计执行了${i}步获取 n=1的值!"
    这段代码4个测试点全错,然后我直接把循环写到了判断里面
    read  n 
    if [ $n -gt 0 -a $n -le 1000 ] 
    then
    i=0
    while [ $n != 1 ]; do
            if [ `expr $n % 2` -eq 0 ]
            then
                    n=`echo "$n/2" |bc ` 
            else
                    n=`echo "((3*$n)+1)/2" |bc `
            fi
            let i+=1
    done
        echo $i
    else
        exit
    fi

      4个点错了2个。

    测试点分析(不知道是怎么判断的,所以慢慢改)

    第四个,考察的是答案范围:题目中的n为正整数且不能超过1000,推断出  0<n<=1000的,满足此条件满足;

    if [ $n -gt 0 -a $n -le 1000 ]

    嗯,看了C语言代码又去掉了if条件判断,发现这里对数字范围判断不是测试点。

    第三个测试点,对while格式的考察,参照示例修改while语句之后,通过;

    while read i; do
      echo $((${i/ /+}))
    done
    改成:
    while [ ${n} != 1 ];do

    第二个测试点,不知道考察的是什么。

    第一个测试点,也不知道考察的是什么。

    脚本编写过程中的问题:

      1.奇偶性判断问题,与sql中的mod函数混淆了;

      2.关于算术运算,一元方程用 expr还是bc 工具有点疑问,expr使用 运算符前后需要空格;

      3.算术运算中,运算符的使用问题  % 为取余。

    补充python版本:

    #!/usr/bin/python3
    #-*- coding:utf-8 -*-
    
    #n=int(input("请输入数字n:")) 不要做多余的注释,不然不会通过
    n=int(input())
    count=0
    
    while n != 1:
        if n%2==0:   #需要记住 取模是% ,地板除是//
            n=n/2
        else:
            n=(3*n+1)/2 #此处的乘号需要写出来
        count=count + 1
    
    print(count)
    

      

  • 相关阅读:
    自动补全命令插件的安装(centos)
    vim tab设置为4个空格
    CentOS系统将UTC时间修改为CST时间
    Zabbix报错 zabbix:cannot convert value to numeric type解决
    php-fpm平滑重启开启关闭
    虚拟机启动network服务失败,Job for network.service failed because the control process exited with error code问题
    Tomcat中设置站点子目录的方法
    WordPress添加背景音乐plus教程
    WordPress使用必应每日一图作登录页面背景
    WordPress自定义美化
  • 原文地址:https://www.cnblogs.com/wyf-349/p/11222142.html
Copyright © 2011-2022 走看看