首页 > 试题广场 >

魔法数字变换

[编程题]魔法数字变换
  • 热度指数:12995 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个数字魔法,给你一个正整数n,如果n为偶数,就将他变为n/2, 如果n为奇数,就将他变为乘3加1
不断重复这样的运算,经过有限步之后,一定可以得到1
牛牛为了验证这个魔法,决定用一个整数来计算几步能变成1


输入描述:
输入一个正整数n,范围在100以内


输出描述:
输出一个整数
示例1

输入

3

输出

7

说明

3->10->5->16->8->4->2->1。总共需要7步 
#include<stdio.h>
int main(){
    int n , i_output = 0 , i_mid_var;
    scanf("%d",&n);
    i_mid_var = n;
    while(i_mid_var != 1)
    {
        if( i_mid_var % 2 == 0 )
        {
            i_mid_var = i_mid_var / 2;
            i_output++;
        } 
        else
        {
            i_mid_var = i_mid_var * 3 + 1;
            i_output++;
        }
    }
    printf("%d",i_output);
    return 0;
}

发表于 2022-06-15 10:15:36 回复(0)
#include <iostream>
using namespace std;

int main()
{
    int n;
    cin >> n;
    int t = 0;
    while (n != 1)
    {
        if (n % 2 == 0) n >>= 1;
        else n = 3 * n + 1;
        t ++;
    }
    cout << t << endl;
}

发表于 2022-02-26 14:20:17 回复(0)
#include <stdio.h>

int main() {
    int a = 0, sum = 0;
    scanf("%d", &a);
    while (a != 1) {
        // if(a % 2 )
        // {
        //     a = a * 3 + 1;
        // }
        // else
        // {
        //     a = a / 2;
        // }
        a = (a % 2 == 0) ? a / 2 : a * 3 + 1;
        sum++;

    }
    printf("%d", sum);
    return 0;
发表于 2024-11-22 12:32:31 回复(0)
#include <stdio.h>

int main() {
    int n, count = 0;
    scanf("%d", &n);
    while (n!=1) {
        if(n%2==0){
            n/=2;
        }
        else{
            n=n*3+1;
        }
            count++;
    }
    printf("%d", count);
    return 0;
}

编辑于 2024-02-07 09:13:43 回复(0)
#include<stdio.h>

int main(void) {
    int a;
    int sum = 0;
    scanf("%d", &a);
    while (a != 1) {
        if (a % 2 == 1) {
            a = 3 * a + 1;
            sum++;
        } else {
            a = a / 2;
            sum++;
        }
    }

    printf("%d", sum);
    return 0;
}

发表于 2022-05-06 16:43:31 回复(0)

int main() {
    int a, sum = 0;
    cin >> a;
    while(a != 1) {
        if(a & 1) a = a * 3 + 1;
        else a >>= 1;
        sum ++;
    }
    cout << sum;
}
发表于 2025-12-06 14:26:27 回复(0)
n=int(input())
count=0
while(n!=1):
    if n%2==0:
        n/=2
        count+=1
    else:
        n=n*3+1
        count+=1

print(count)

发表于 2025-11-22 16:33:39 回复(0)
//依旧递龟
#include <stdio.h>

int count_1(int n,int* count){
    if(n==1){
        return 0;}
    else{
        if(n%2==0) n=n/2;
        else{
            n=3*n+1;}
    }
    (*count)++;//加上中括号//注意该语句的位置
    return count_1(n,count);
}
int main() {
    int n;
    scanf("%d",&n);
    //法一:非递归
    // int count=0;
    // while(n!=1){
    //     if(n%2==0) n/=2;
    //     else n=3*n+1;
    //     count++;
    // }
    //法二:递归
    int temp=0;
    int* count=&temp;//让count有指向,防止count成为空指针
    count_1(n,count);
    printf("%d\n",*count);
    return 0;
}
发表于 2025-10-11 13:08:43 回复(0)
//清爽代码(大神勿喷)
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int sum = 0;
    int count = 0;
    while (n > 1)
    {
        if (n % 2 == 0)
        {
            sum = n / 2;
            n = sum;
        }
        else
        {
            sum = n * 3 + 1;
            n = sum;
        }
        count++;
    }
    printf("%d", count);
    return 0;
}

//详细解释
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    int sum = 0;
    int count = 0;
    while (n > 1) // n == 1 的时候就退出循环
    {
        if (n % 2 == 0) // n % 2 == 0 说明是偶数
        {
            sum = n / 2;
            n = sum; // 把值赋给 n,不然会无限循环
        }
        else // n % 2 != 0 说明是奇数
        {
            sum = n * 3 + 1;
            n = sum; // 把值赋给 n,不然会无限循环
        }
        count++; // 每循环一次 count 就加一次,累计循环次数
    }
    printf("%d", count); // 最后输出循环次数
    return 0;
}
发表于 2025-06-15 17:35:51 回复(1)
a=int(input())
i=0
while a!=1:
    if a%2==0:
        a=a/2
    else:
        a=a*3+1
    i+=1
print(i)

发表于 2025-02-19 10:10:31 回复(0)
这个题目的测试案例明显有问题:n又没说不能等于1,当n=1时,你们这些循环都进不去,,1>4>2>1,当n等于1的时候,ans=3;


发表于 2024-11-04 20:31:10 回复(0)
n = int(input())
sep = 0
while n != 1:
    if  n % 2 == 0:
        n =n//2
        sep += 1
    else:
        n = n*3 +1 
        sep += 1
print(sep)

发表于 2024-09-28 14:34:02 回复(0)
#include <stdio.h>

int main() {
    int n,i=0,j=0;
    scanf("%d",&n);
    while(n!=1)
    {
    if(n%2==0)
    {
        n=(n/2);
        i++;
    }
    else{
        n=(3*n+1);
        j++;
    }
    }
    printf("%d",i+j);
    return 0;
}

发表于 2024-09-27 13:09:45 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.close();

        int steps = magic(n);
        System.out.println(steps);
    }

    public static int magic(int n) {
        int tmp = n;
        int count = 0;
        while (tmp >= 1) {
            if (tmp == 1) {
                break;
            }
            if (tmp % 2 == 0) {
                tmp = tmp / 2;
                count++;
            } else {
                tmp = tmp * 3 + 1;
                count++;
            }
        }
        return count;
    }
}

发表于 2024-08-07 16:06:03 回复(0)
#include <stdio.h>

int main() {
    int n = 0;
    int count = 0;
    stare:
    scanf("%d", &n);
    if(n>0&&n<=100)
    {
        while( n != 1 )
        {
            if( n % 2 ==0 )
            {
                n = n / 2;
            }
            else 
            {
                n = n * 3 + 1;
            }
            count++;
        }
    }
    else {
    printf("输入n值不在0~100以内,请重新输入:");
    goto stare;
    }
    printf("%d",count);
    return 0;
}

发表于 2024-08-03 12:49:21 回复(0)
#include <stdio.h>

int main() {
    int n;
    int count = 0;
    scanf("%d", &n);
    while (n != 1) {
        if (n % 2 == 0) {
            n = n / 2;
        } else {
            n = 3 * n + 1;
        }
        count++;
    }
    printf("%d", count);
    return 0;
}


发表于 2024-07-25 23:38:44 回复(0)

/*思路 : 分两种情况,一种是偶数,一种是奇数
          但是如果是奇数的话,进行乘3然后加1操作之后
          还是偶数。
          使用 count 来判断 进入循环多少次 就能得出计算了几步
*/
# include <stdio.h>
int main ()

{
    int n = 0;
    int count = 0;
    scanf("%d",&n);
    while (n!=1) //当n不为1的时候就一直进行循环
                 //当n为1的时候退出循环
    /*一旦 n 变为 1,条件 (n != 1) 不再为真,循环就会结束。*/
    {
        if (n%2==0) //判断偶数
        {
            n=n/2;
        }
        else //判断奇数
        {
            n = (3*n)+1;
        }
        count++;// 无论 n 是奇数还是偶数,步数都加 1
    }
    printf("%d",count);
    return 0;
}

发表于 2024-05-19 22:35:37 回复(0)
#include <stdio.h>

int main()
{
	int a = 0;
	int count = 0;
	scanf("%d", &a);
	do
	{
		if (a % 2 == 0)
		{
			a /= 2;
			count++;
		}
		else
		{
			a = a * 3 + 1;
			count++;
		}
	} while (a != 1);	//a==1时跳出循环
	printf("%d\n", count);
	return 0;
}

发表于 2024-05-11 18:57:25 回复(0)
n = int(input())
s = 0
while n != 1:
    try:
        if n % 2 == 0:
            n = n/2
        else:
            n = 3*n + 1
        s += 1
    except:
        break
print(s)
发表于 2024-05-08 10:59:40 回复(0)
#include <iostream>
using namespace std;

int main() 
{
    int a;
    cin >> a;
    int count = 0;
    while (a!=1) 
    {
        if (a%2==0) 
            a/=2;
        else
            a=a*3+1;
        count++;
    }
    cout << count << endl;
}

发表于 2024-05-03 12:53:02 回复(0)