解题思路

1.输入两个整数,a,b,然后输出这两个数,每个后面都要有一个空格符;(以文件结束符结束)

2.如果a>b,交换这两个数;

3.判断从a到b的每一个数 i(包括a,b),(1)如果i为奇数i=i*3+1,如果为偶数i=i/2;直到i==1时停止;

4.同时记录下(1)过程循环的次数x,用一个变量max记录所有 a~b,过程次数最高的值,每一个i比较一次,如果x>max,max=x;

5.输出max,加换行符;




注意事项:
每次输入新的一组数后都要置max=0;

要在交换a b 之前输出a b;

可以用递归,测试数据其实没有超过1000000,亲测,安稳:

#include <stdio.h>
void maxcycle( int n, int x );


int max = 0;
/*--------------------------------------------------*/
int main()
{
    int a, b;

    while ( scanf( "%d%d", &a, &b ) != EOF )
    {
        max = 0;
        printf( "%d %d ", a, b );  //输出 a ,b
        if ( a > b )                       //交换
        {
            a += b; b = a - b; a -= b;
        }

        for ( int i = a; i <= b; i++ )
            maxcycle( i, 0 );            //执行过程

        printf( "%d\n", max + 1 );       //输出
    }
    return(0);
}


/*-------------------------------------------------*/
void maxcycle( int n, int x )
{
    if ( n == 1 )
    {
        if ( x > max )
            max = x;
        return;
    }else
    if ( n % 2 != 0 )
    {
        n = n * 3 + 1;
    }else
    if ( n % 2 == 0 )
    {
        n /= 2;
    }
    x++;
    maxcycle( n, x );
    return;
}
参考代码:


#include <stdio.h>
void maxcycle( int n, int x );


int max = 0;
/*---------------------------------------------------*/
int main()
{
    int a, b;

    while ( scanf( "%d%d", &a, &b ) != EOF )
    {
        max = 0;
        printf( "%d %d ", a, b );
        if ( a > b )
        {
            a += b; b = a - b; a -= b;
        }

        for ( int i = a; i <= b; i++ )
            maxcycle( i, 0 );

        printf( "%d\n", max + 1 );
    }
    return(0);
}


/*-----------------------------------------------------*/
void maxcycle( int n, int x )
{
    while ( n > 1 )
    {
        if ( n % 2 != 0 )
        {
            n = n * 3 + 1;
        }else
        if ( n % 2 == 0 )
        {
            n /= 2;
        }
        x++;
    }


    if ( x > max )
        max = x;

    return;
}

别忘点赞哦-.-

点赞(42)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

5年前 回复TA
@Ealin 题目变态,a可能大于b,但输出还必须先输出a
5年前 回复TA
你测过 
1 1000000 么?
Ealin 5年前 回复TA
为什么一定要在交换a、b前输出a、b?最后输出系统就提示错误33%