其他分享
首页 > 其他分享> > 冰雹猜想

冰雹猜想

作者:互联网

题目描述

给出一个正整数 n(n\le 100)n(n≤100),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2。经过若干次循环后,最终都会回到 1。经过验证很大的数字(7\times10^{11}7×1011)都可以按照这样的方式比变成 1,所以被称为“冰雹猜想”。例如当 nn 是 20,变化的过程是 [20, 10, 5, 16, 8, 4, 2, 1]。根据给定的数字,验证这个猜想,并从最后的 1 开始,倒序输出整个变化序列。

输入输出样例

输入 #1
20
输出 #1
1 2 4 8 16 5 10 20

题目分析

首先我们得出了下列信息:

1.如果为奇数就乘以3加1

2.如果为偶数就除以2

3.递归调用方法可以比较简单的实现函数

注意:这里输出顺序是倒序,只要把输出放在迭代函数的后面,就可以实现倒序。

上代码:

#include<cstdio>

#include<iostream>

using namespace std;

void fun(int n);//声明函数的递归

int main()

{

    int n;

     scanf("%d", &n);

    fun(n);cout << endl;

   return 0;

}

void fun(int n)             //用函数的递归来完成题目

{

    if(n==1) {cout << 1 << ' ';

            return ;

}

    else if(n%2==0) fun(n/2);//如果是偶数就不断递归n/2

    else fun(n*3 + 1);//如果是奇数就不断递归 n*3 + 1

    cout << n << ' ';          //把输出放在迭代函数的后面,就可以实现倒叙。

    return ;

}

这样实现了倒序排序。输入20 得出的结果是1 2 4 8 16 5 10 20

 

 

但是如果把cout << n << ' ';          //把输出放在递归函数的后面,就可以实现倒叙。放在递归函数的前面

代码如下:

#include<cstdio>
#include<iostream>
using namespace std;
void fun(int n);//声明函数的递归
int main()

{

int n;

scanf("%d", &n);

fun(n);cout << endl;

return 0;

}

void fun(int n) //用函数的递归来完成题目

{
cout << n << ' '; 
if(n==1)
{ cout << 1 << ' '; return ; }


else if(n%2==0) fun(n/2);//如果是偶数就不断递归n/2

else fun(n*3 + 1);//如果是奇数就不断递归 n*3 + 1

return ;

}

题目总结

 1.大家可以观察一下递归函数中cout << n << ' '; 这条语句在后面可以实现倒叙,如果在前面实现的是正序排列。

2.注意递归调用的方法可以解决一些多次调用的问题。

3.注意奇数和偶数的判断。

4.调用函数的声明位置注意。

5.结果经过调试和验证。

标签:20,猜想,递归,int,冰雹,fun,return,cout
来源: https://www.cnblogs.com/limingze/p/14801181.html