原题链接:The 3n + 1 problem
解题思路
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;
}别忘点赞哦-.-
0.0分
4 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复