首页 > 试题广场 >

害死人不偿命的(3n+1)猜想 (15)

[编程题]害死人不偿命的(3n+1)猜想 (15)
  • 热度指数:4773 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
卡拉兹(Callatz)猜想:



对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步

得到n=1。卡拉兹在1950年的世界数学家大会上公布了这个猜想,传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,

结果闹得学生们无心学业,一心只证(3n+1),以至于有人说这是一个阴谋,卡拉兹是在蓄意延缓美国数学界教学与科研的进展……



我们今天的题目不是证明卡拉兹猜想,而是对给定的任一int范围内的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1?

输入描述:
每个测试输入包含1个测试用例,即给出自然数n的值。


输出描述:
输出从n计算到1需要的步数。
示例1

输入

3

输出

5

python solution

a,res=int(input()),0
while a!=1:
    if a%2==0:a=a//2
    else:a=(3*a+1)//2
    res+=1
print(res)
发表于 2017-10-11 06:41:55 回复(0)
#include <stdio.h>
int main(void){
    int n=0,step;
    scanf("%d",&n);
    for(step=0;n!=1;++step){
        if((n&1)==1)
            n=(n*3+1)>>1;
        else
            n=n>>1;
    }
    printf("%d",step);
    return 0;
}

编辑于 2016-02-17 13:50:13 回复(0)
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
	int n, count = 0;
	cin >> n;
	while(n!=1){
		count++;
		if(n%2==0) n /= 2;
		else n = (3*n+1)/2;
	}
	cout<<count;
	return 0;
}
这是我来牛客网写的最简单的题
发表于 2020-01-17 15:48:25 回复(0)
// 做这种题目,感觉真爽
n = int(input())
count = 0
while n != 1:
    if n%2== 0:
        n = n//2
    else:
        n = (3*n+1)//2
    count += 1
print(count)

发表于 2017-12-11 15:04:08 回复(1)
#include <stdio.h>
void callatz_fun()
{
int n;
scanf("%d", &n);
int step = 0;
while (n != 1) {
if (n % 2 == 0) {
n = n / 2;
}
else {
n = (3 * n + 1) / 2;
}
step++;
}
printf("%d", step);
}

int main()
{
callatz_fun();
return 0;
}
发表于 2017-09-01 19:05:56 回复(0)
#include<bits/stdc++.h>
using namespace std;

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

发表于 2022-11-02 09:54:07 回复(0)
#include<iostream>
usingnamespacestd;
 
intmain()
{
    intn;
    cin>>n;
    intcount=0;
     
    while(n!=1)
    {
        if(n%2==0)
        {
            n=n*0.5;
            count++;
        }
        else{
            n=(3*n+1)*0.5;
            
            count++;
        }
         
    }
    cout<<count;
    return0;
}
发表于 2020-07-26 17:25:51 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	int count=0;
	scanf("%d",&n);
	while(n!=1)
	{
		if(n%2==0)
		{
			n=n/2;
			count++;
		}
		else{
			n=(3*n+1)/2;
			count++; 
		}
	}
	printf("%d\n",count);
	
}
做这种题真爽
发表于 2020-03-29 15:38:04 回复(0)
#include <stdio.h>
#include <stdlib.h>

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

    return 0;
}

编辑于 2020-03-04 15:33:50 回复(0)
#include <cstdio>

int main() {

    int n;
    scanf("%d", &n);
    int count = 0;
    while (n != 1) {
        n = n % 2 == 0 ? n >> 1 : (3 * n + 1) >> 1;
        count++;
    }
    printf("%d", count);
    return 0;
}

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

发表于 2019-12-05 13:15:51 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner s = new Scanner(System.in);
        int n = s.nextInt(), time=0;
        while(n != 1){
            if(n % 2 == 0)
                n = n / 2;
            else
                n = (3 * n + 1) / 2;
            time++;
        }
        System.out.println(time);
    }
}

发表于 2019-10-10 08:56:50 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,i=0,j;
    cin>>n;
   do
    {
    if(n%2==0)
    {
       n=n/2;
       i++;
 }
 if(n%2!=0&&n!=1)
 {
  n=(3*n+1)/2;
  i++;
 }
 }while(n!=1);
 cout<<i<<endl;
 return 0;
}

发表于 2019-04-16 23:09:48 回复(0)
学渣快乐题

#include <iostream>
using namespace std;
int main(){
    int n,times;
    cin>>n;
    while(n!=1){
        if(n%2!=0)n=3*n+1;
        n/=2;
        ++times;
    }
    cout<<times;
    return 0;
} 

发表于 2019-04-02 17:22:57 回复(0)
n = input()
n = int(n)
con = 0
while n!=1:
    if n%2==0:
        n=n//2
        con+=1
    else:
        n = (3*n+1)//2
        con+=1
print(con)

发表于 2018-11-29 11:18:38 回复(0)
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int count=0;
            while(n!=1){
                if(n%2==0){
                    n=n/2;
                }else{
                    n=(3*n+1)/2;
                }
                count++;    
            }
            System.out.println(count);
        }
    }
}

发表于 2018-10-02 00:18:57 回复(0)
思路: 按部就班。
#include <iostream>
using namespace std;

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

发表于 2018-08-13 21:13:28 回复(0)
还以为有啥,居然暴力就行,。。。。、。
发表于 2018-07-12 15:14:08 回复(0)
import java.util.*;
public class Main
    public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    while(sc.hasNext()){
    int a=sc.nextInt();
    int count=0;
      while(a!=1){
          if(a%2==0){
              a=a/2;
              count++;
          }else{
              a=(a*3+1)/2;
              count++;
              }
           }
    System.out.println(count);
        }
    }
}
发表于 2018-06-22 10:44:23 回复(0)
import java.util.*;

public class Main {

    public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
        long num=in.nextInt();
        long count=0;
        in.close();
        while(num!=1) 
    {
        if(num%2==0) 
        {
            num=num/2;
            count++;    
        }
        else {
            num=((3*num+1)/2);
            count++;
            }        
    }
    System.out.println(count);
}
}

发表于 2018-04-30 22:02:58 回复(0)