题目 1095: The 3n + 1 problem

题目描述

Consider the following algorithm to generate a sequence of numbers. Start with an integer n. If n is even, divide by 2. If n is odd, multiply by 3 and add 1. Repeat this process with the new value of n, terminating when n = 1. For example, the following sequence of numbers will be generated for n = 22: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 It is conjectured (but not yet proven) that this algorithm will terminate at n = 1 for every integer n. Still, the conjecture holds for all integers up to at least 1, 000, 000. For an input n, the cycle-length of n is the number of numbers generated up to and including the 1. In the example above, the cycle length of 22 is 16. Given any two numbers i and j, you are to determine the maximum cycle length over all numbers between i and j, including both endpoints.

输入

The input will consist of a series of pairs of integers i and j, one pair of integers per line. All integers will be less than 1,000,000 and greater than 0.

输出

For each pair of input integers i and j, output i, j in the same order in which they appeared in the input and then the maximum cycle length for integers between and including i and j. These three numbers should be separated by one space, with all three numbers on one line and with one line of output for each line of input.

样例输入复制

1 10
100 200
201 210
900 1000

样例输出复制

1 10 20
100 200 125
201 210 89
900 1000 174

 这道题目的大概意思翻译下来是这么一回事:就是一个数如果是偶数,那么除以2;如果是奇数,就乘以3再加1。题目给你两个端点值,让你找出这个范围内符合题目要求的最大的数的执行次数。角谷猜想(Collatz conjecture)有兴趣的朋友可以去自己查一查,又叫做角谷猜想(Collatz conjecture)。

#include<stdio.h>
int main()
{int a,b,i,step=0,temp=0;//a,b分别是区间的两个端点,step用来记录遍历过程中
                         //   最大的次数,temp用来暂时存储当前数字的次数。
    
    while(~scanf("%d%d",&a,&b)){//用来判断是否输入是否结束 
                                //也可以使用scanf("%d%d",&a,&b)!=EOF
     printf("%d %d ",a,b);   
     if(a>b) {                //保证a<b,如果不符合就交换二者。
          i=a;a=b;b=i;
      } 
      
      for(i=a;i<=b;i++){    //对这个区间内的数字进行遍历。
          temp=fun1(i);     //自定义函数来执行题目所要求的功能。
          if(step<temp)     //判断是否当前temp>step,是的话让step=temp.
            step=temp;
      }
      
      printf("%d\n",step);
      step=0;               //每次执行后记得清零,否则会引起错误。
    }
	return 0;
}
int fun1(int x){
    int m=0;
    while(x!=1){
            if(x%2==0) {x/=2;m++;}
            else {x=x*3+1;m++;}
    }
    return m+1;             //根据题目本身也算一次,加1。
}

这道题没什么特别难得地方,就是注意根据题目要求输出格式以及它本身也会算一次。利用暴力枚举范围内的数字。对每个进行判断即可得出结果。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值