zoukankan      html  css  js  c++  java
  • 1001.害死人不偿命的(3n+1)

    卡拉兹(Callatz)猜想:

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

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

    输入格式:

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

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

    输入样例:

    3
    

    输出样例:

    5
    首先根据计算方法,把每一次的处理分为两种情况(奇数、偶数),
    然后因为要得出次数,所以很自然需要计数器和循环。临界条件比较清晰,
    题目中说:简单地数一下,需要多少步才能得到n=1?所以临界条件就是n是否等于一,这里编程就是n!=1。我的代码如下:
    #include <iostream>
    using namespace std;
    int main()
    {
        int n;
        cin>>n;
        int count=0;
        while(n!=1)//临界条件
        {
             if(n%2==0)//如果它是偶数,那么砍掉一半
            {
                n/=2;
            }else//如果它是奇数,则……
            {
                n=(3*n+1)/2;
            }
            count++;//记录次数
        }
        cout<<count;return 0;
    }
    #include<stdio.h>
    int main()
    {
         int n,times = 0;
         while(scanf("%d",&n) != EOF)
         {
             if(n > 1000 || n < 0)
             {
                 printf("error!");
             }
             while(n!= 1)
             {
                 if(n % 2 == 0)
                 {
                     n = n / 2;
                 }
                 else
                 {
                     n = (n * 3 + 1) / 2;
                 }
                 times++;
             }
             printf("%d
    ", times);
         }
         return 0;
    }
  • 相关阅读:
    磁盘及分区管理
    用户和文件权限管理
    分割文件命令split
    去除重复命令uniq
    数据连接命令join
    数据剪切命令cut和数据粘贴命令pastte
    排序命令sort
    koa-router
    koa入门
    require.ensure的用法;异步加载-代码分割;
  • 原文地址:https://www.cnblogs.com/2228212230qq/p/7689348.html
Copyright © 2011-2022 走看看