zoukankan      html  css  js  c++  java
  • (HDU/UVA)1032/100--The 3n + 1 problem(3n+1问题)

    描述
    计算机科学中的问题通常被归类为属于某一类问题(例如,NP,不可解,递归)。在这个问题中,您将分析算法的属性,该算法的分类对于所有可能的输入都是未知的。

    考虑下面的算法:


        1.输入n

        2.输出n

        3.如果n = 1,则停止

        4.如果n是奇数,则n=3n + 1

        5.否则n=n / 2

        6.返回第2步


    给定输入22,将输出以下序列的数字22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1

    据推测,使用上述算法任何输入值将终止(当输出1时)。尽管算法简单,但是不知道这个猜想是否为真。

    然而,已经验证了所有整数n,使得0 <n <1,000,000(并且实际上,比这更多的数目也成立)。

    给定输入n,可以确定输出的数字的数量(包括1)。对于给定的n,这被称为n的周期长度。在上面的例子中,22的周期长度为16。

    对于任何两个数字i和j,您将确定i和j之间的所有数字的最大循环长度。


    输入
    输入将由一系列整数对i和j组成,每行一对整数。所有整数将小于1,000,000和大于0。

    你应该处理所有的整数对,并且对每个对确定i和j之间的所有整数的最大循环长度。

    您可以假设没有操作溢出32位整数。


    输出
    对于每对输入整数i和j,应输出i,j和i和j之间的整数的最大循环长度。这三个数字应该由至少一个空格分隔,一行上的所有三个数字和每行输入的一行输出。整数i和j必须以与它们在输入中出现的顺序相同的顺序出现在输出中,并且后跟最大循环长度(在同一行上)。


    样例输入
    1 10
    100 200
    201 210
    900 1000
    样例输出
    1 10 20
    100 200 125
    201 210 89
    900 1000 174

    #include <iostream>
    #include <cstdio>
    
    using namespace std;
    
    int cnt(int n)
    {
        int cnt=1;
        while(n!=1)
        {
            if(n%2==0) n=n/2;
            else n=3*n+1;
            cnt++;
        }
        return cnt;
    }
    
    int main()
    {
        int i,j,t;
        while(~scanf("%d %d",&i,&j))
        {
            printf("%d %d ",i,j);
            if(i>j)
            {
                int temp;
                temp=i;
                i=j;
                j=temp;
            }
            int ans=0;
            for(t=i;t<=j;t++)
            {
                if (cnt(t)>ans) ans=cnt(t);
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    题目有个坑哦
  • 相关阅读:
    对double数据类型的数据保留两位小数,并且进行四舍五入
    div位置设置
    每天一算法 -- (排序算法总结)
    SQL行转列
    设计模式的六大原则
    每天一算法 -- (插入排序)
    每天一算法 -- (选择排序)
    通用扩展函数--类型转换
    wcf和webservice
    Cookie的介绍及使用
  • 原文地址:https://www.cnblogs.com/ACDoge/p/6126822.html
Copyright © 2011-2022 走看看