注册 登录
编程论坛 C++教室

角谷猜想

小人儿 发布于 2019-12-04 20:07, 4058 次点击
III.角谷猜想
所谓角谷猜想,是指对于任意一个正整数,如果是奇数,则乘3加1,如果是偶数,则除以2。对于计算得到的结果再按照上述规则重复处理,最终总能够得到1。例如,假定初始整数为5,计算过程分别为16、8、4、2、1。编程完成以下内容:
1.    要求输入一个整数,将经过处理得到1的过程输出来;
2.    使用递归函数;
3.    输出结束后,输出递归次数。
如:输入22,则输出11  34  17  52  26  13  40  20  10  5  16  8  4  2  1
     STEP = 15.
#include<stdio.h>
int digui(int n);
int main()
{
    int n,m;
    printf("输入一个整数n:");
        scanf("%d",&n);
        if(n==1)
        {
            printf("%d\n",n);
        }
        else
        {
        m=digui(n);
        printf("%d\n",m);
        }
}
int digui(int n)
{
    while(n!=1)
    {
        if(n%2==0)
            n=n/2;
        else
            n=n*3+1;
        printf("%d\n",n);
    }
                return n;
}
大佬们帮我看看为啥我最后输出的都多一个1啊  谢谢
6 回复
#2
Jason_2019-12-04 20:58
程序代码:
else
        {
        m=digui(n);
        printf("%d\n",m);
        }

这里的printf删掉,因为函数digui中已经输出所有的结果了,再加一个输出相当于把最后一个结果多输出了一遍
#3
rjsp2019-12-05 08:57
题目要求“2. 使用递归函数”,但你根本没用递归呀!
另外,如果n==1,难道不应该是输出0次吗,你怎么输出1次?
题目中的输出是以“空格”间隔,你怎么用的是“换行”作间隔?

程序代码:
#include <stdio.h>

unsigned Collatz( unsigned n, unsigned* step )
{
    if( n <= 1 )
        return n;

    if( step )
        ++*step;

    if( n%2 == 0 )
        n /= 2;
    else
        n = n*3+1;

    printf( "%u%c", n, " \n"[n==1] );
    return Collatz(n,step);
}

int main( void )
{
    unsigned n;
    scanf( "%u", &n );

    unsigned step = 0;
    Collatz( n, &step );
    printf( "STEP = %u\n", step );
}

#4
maomao123452020-03-24 10:22
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,s;
    cin>>n;
    while(n!=1){
        double p=n*3+1;   
        if(n%2==1){
            cout<<n<<"*3+1="<<p<<endl;
            n=n*3+1;
        }
        if(n%2==0){
            s=n/2;
            cout<<n<<"/2="<<s<<endl;
            n/=2;
        }
    }
    cout<<"End";
    return 0;
}
这是我C1的时候写的代码,别喷
#5
maomao123452020-03-24 10:23
我没有递归次数,你可以输出一次++。
#6
return_02020-03-24 21:01
说的强硬点:你这是递归吗?
#7
return_02020-03-24 21:02
函数中都没有自我调用,怎能达成循环呢?
若不是循环,cnt怎么可能大于1呢
1