问题标题: 酷町堂:3683   卡拉兹猜想(callatz)

0
0
已解决
范皓翔
范皓翔
初级光能
初级光能

3683   卡拉兹猜想(callatz)

题目描述 Description

卡拉兹在 1950年的世界数学家大会上公布了著名的卡拉兹猜想,即对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那把 (3n+1) 砍掉一半。这样一直反复砍下去,最后一定在某一步得到 n=1。传说当时耶鲁大学师生齐动员,拼命想证明这个貌似很傻很天真的命题,结果闹得学生们无心学业,甚至有人说这是一个阴谋,是在蓄意延缓美国数学的发展和进步。

同学们,对于给定的任一不超过 1000的正整数 n,请计算需要多少步(砍几下)才能得到 n=1。

输入描述 Input Description

输入只有一行,一个正整数 n。

输出描述 Output Description

输出一个正整数 k,表示需要 k步才能得到 n=1。

样例输入 Sample Input

 

3

样例输出 Sample Output

 

5

数据范围及提示 Data Size & Hint

对于100%的数据:1≤n≤1000

 

3683   卡拉兹猜想(callatz)

 

Wrong Answer:20分

 

 

范皓翔的测评结果:

 

测试点#1测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#2测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#3测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#4测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#5测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#6测评结果 : Accepted时间 : 0ms
测试点#7测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#8测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#9测评结果 : Wrong Answer时间 : 0ms偷看一下数据测试点#10测评结果 : Accepted时间 : 0ms

 

我的提交(cpp):

#include <bits/stdc++.h>

using namespace std;

int main() {

int s=0,n;

cin>>n;

while(n!=1){

if(s%2==0) n=n/2;

else n=(n*3+1)/2; s++;

}

cout<<s;

return 0;

}


0
已采纳
聂帅
聂帅
初级守护
初级守护

一个地方:

if(s%2==0)n/=2;

这里s改成n

聂帅在2019-09-16 21:25:25追加了内容

求采纳

0
许金夫
许金夫
初级天翼
初级天翼

没错,楼上是对的。你其他都可以

0
0
赵逸凡
赵逸凡
初级启示者
初级启示者

可以用递归/递推

int k(int n,int step)
{
   if(n==1)return step;
   if(n%2==0)n/=2;
   else n=(n*3+1)/2;
   return k(n,step+1);
}

 

0
0
高子健
高子健
新手天翼
新手天翼
if(s%2==0) n=n/2;

改成

if(n%2==0) n=n/2;

望采纳!!!!!!

0
被禁言 李彦伯
李彦伯
修练者
修练者


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

0
陈一彤
陈一彤
修练者
修练者

s是用来计数的,不能用来判断但是或着双数

我要回答