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长度”,并设置一个变量来保存它,求出最大值,最后打印出这个最大值。
附上代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
附上代码: #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; }