原题链接: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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复