100 The 3n + 1 problem

题目大意
题目原文 http://uva.onlinejudge.org/external/1/100.pdf

一个数(一百万以内)如果是奇数,乘三加一;如果是偶数,除以二;循环下去,直到等于1为止,这样包括他自己本身出现的数字的个数被称为该数字的“3n+1长度”;题目要求输入两个数,求出这两个数(i和j)之间的最长的“3n+1长度”。

首先想到i和j有大小的关系,但题目要求输出的顺序不变,所以先输入i和j并立马打印出来,然后再比较i和j的大小并交换。然后根据穷举法,逐个求出i和j之间的数的“3n+1长度”,并设置一个变量来保存它,求出最大值,最后打印出这个最大值。


附上代码:

View Code
附上代码:

#include<stdio.h>
long f(long a) //该函数返回数a的“3n+1长度”
{
  long i=1;
  while(a!=1)
  {
   if(a%2) a=3*a+1;
   else a/=2;
   i++;
  }
  return i;
}

int main()
{
   long i,j,n,m,x;         //变量为long是因为题目要求i和j在一到一百万之间
   while(scanf("%ld%ld",&i,&j)!=EOF)
   {
    printf("%ld %ld ",i,j);//首先打印出输入的i和j,有空格来应题目格式要求
    n=0;                   //“3n+1长度”一定会大于0,n用于保存当前最大的“3n+1长度”
    if(i>j) {x=i;i=j;j=x;} //比较大小并交换
    for(;i<=j;i++)
    {
      m=f(i);
      if(m>n) n=m;
    }                       
    printf("%ld\n",n);
   }
   return 0;
}
原文地址:https://www.cnblogs.com/syiml/p/100_.html