###### tags: `UVa`
- [x] check
# UVa c039: 00100 The 3n + 1 problem
:::info Problems in Computer Science are often classified as belonging to a certain class of problems (e.g., NP, Unsolvable, Recursive). In this problem you will be analyzing a property of an algorithm whose classification is not known for all possible inputs.
Consider the following algorithm:
1. 2. 3. 4. 5. 6.
input n
print n
if n = 1 then STOP
if n is odd then n ←− 3n + 1
else n ←− n/2 GOTO 2
Given the input 22, the following sequence of numbers will be printed 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
It is conjectured that the algorithm above will terminate (when a 1 is printed) for any integral input value. Despite the simplicity of the algorithm, it is unknown whether this conjecture is true. It has been verified, however, for all integers n such that 0 < n < 1,000,000 (and, in fact, for many more numbers than this.)
Given an input n, it is possible to determine the number of numbers printed before and including the 1 is printed. For a given n this is called the cycle-length of n. In the example above, the cycle length of 22 is 16.
For any two numbers i and j you are to determine the maximum cycle length over all numbers between and including both i and j.
範例輸入
| Input 1 | Output 2 |
| -------- | -------- |
| 1 10 | 1 10 20 |
| 10 1 | 10 1 20 |
:::
### 1st Ideas of solving a problem
>1.
>2.
>3.
>4.
>5.
>6.
```=c
#include <stdio.h>
int test(int,int);
void swap(int*,int*);
int main(){
int a,b;
while(scanf("%d %d",&a,&b)!=EOF){
printf("%d",a);
printf(" ");
printf("%d",b);
printf(" ");
if(a>b){
swap(&a,&b);
}
printf("%d\n",test(a,b));
}
return 0;
}
int test(int a,int b){
int i;
int max=0;
int temp;
for(i=a;i<=b;i++){
temp=i;
int count=1;
while(temp!=1){
if(temp%2==1){
temp=3*temp+1;
count++;
}
else{
temp=temp/2;
count++;
}
}
if(count>=max){
max=count;
}
}
return max;
}
void swap(int*a,int*b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
```