首页 > 试题广场 >

魔法数字变换

[编程题]魔法数字变换
  • 热度指数:13997 时间限制: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 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)
#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 = 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)
#include <stdio.h>

int main() 
{
    int n = 0;
    int count = 0;
    
    scanf("%d", &n);

    while(n != 1)
    {
        if(n % 2 == 0)
        {
            n /= 2;
        }
        else
        {
            n = n * 3 + 1;
        }
        count++;
    }

    printf("%d\n", count);
    
    return 0;
}

编辑于 2024-04-05 21:52:25 回复(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() {
    int n, tag=0;
    scanf("%d", &n);
    while(n != 1){
        if(n%2==0){
            n /= 2;
        }else{
            n *= 3;
            n++;
        }
        tag++;
    }
    printf("%d", tag);
    return 0;
}
发表于 2024-01-20 10:57:59 回复(0)
#include <stdio.h>

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

发表于 2023-11-07 21:41:14 回复(0)
#include <stdio.h>

int main()
{
    int n=0;
    int count=0;
    scanf("%d",&n);
    while(n!=1)
    {
        if(n%2==1)
        {
            n=n*3+1;
            count++;
        }
        else
        {
            n=n/2;
            count++;
        }
    }
    printf("%d",count);
    return 0;
}
发表于 2023-10-29 20:22:24 回复(0)
#include <stdio.h>

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

发表于 2023-06-24 18:42:24 回复(0)
#include <stdio.h>

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

    return 0;
}
发表于 2023-02-28 10:14:17 回复(0)
#include <stdio.h>

int main() {
    int n, cnt = 0;
    while (scanf("%d", &n) != EOF) {
        while (n != 1) {
            if (n % 2 == 0) {
                n /= 2;
                cnt++;
            } else {
                n = n * 3 + 1;
                cnt++;
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}
发表于 2023-02-20 23:10:15 回复(0)
#include <stdio.h>

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

发表于 2023-02-06 15:33:22 回复(0)
#include <stdio.h>

int main() {
    int a,count=0;
    scanf("%d",&a);
    while(a!=1){
        if(a%2==0){ //判断偶数
            a/=2;
        }else{ //奇数
            a=3*a+1;
        }
        count++; //用于统计次数
    }
    printf("%d",count);
    return 0;
}
发表于 2022-12-06 10:18:40 回复(0)
#include<stdio.h>
int main()
{
    int n=0;
    int i=0;
    scanf("%d",&n);
    while(n!=1){
        if(n%2==0){
            n/=2;
        }else{
            n=n*3+1;
        }
        i++;
    }
    printf("%d",i);
    
    return 0;
}
发表于 2022-09-06 02:38:21 回复(0)
int main(){
    int n,b=0;
    scanf("%d",&n);
    while(n!=1){
        n%2==0?(n=n/2):(n=n*3+1);
        b++;
    }
    printf("%d",b);
    return 0;
}

发表于 2022-08-30 21:57:53 回复(0)
#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int temp=0;
    for(temp=0;n!=1;temp++)
    {
        if(n%2==0)
        {
            n/=2;
        }
        else
        {
            n=3*n+1;
        }
    }
    printf("%d",temp);
    return 0;
}

发表于 2022-08-03 09:22:46 回复(0)

问题信息

上传者:牛客301599号
难度:
32条回答 4027浏览

热门推荐

通过挑战的用户

查看代码
魔法数字变换