---
# System prepended metadata

title: 'UVa c039: 00100 The 3n + 1 problem'
tags: [UVa]

---

###### 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;
}

```







