原题链接:C语言训练-角谷猜想
解题思路:
角谷猜想:任给一个自然数,若为偶数除以2,若为奇数则乘3加1,得到一个新的自然数后按照上面的法则继续演算,若干次后得到的结果必然为1。
从这句话可以看出,只有当新的自然数为1时,才会停止循环。而在循环中,需要判断这个自然数是奇数还是偶数。写程序的思路也就变得很清晰了:先接收输入的一个自然数,然后定义一个循环,只要自然数不为1,这个循环就会直至执行,在循环中需要判断这个数的奇偶性,如果是偶数则按定义除以2,如果是奇数则按定义先乘3再加1,直到这个数最终变成1才结束并输出验证过程。
注意事项:
无论是奇数还是偶数,在经过定义的操作后都会得到一个新自然数,因此,在各个部分的函数中接收的参数应是改变后的新的值,否则程序接收的参数全部都会是没有改变之前的值导致程序出错进入死循环。
参考代码:
正确代码如下:
#include <stdio.h> #include <stdlib.h> // 读取用户输入的数字 int read_number() { int num; printf("请输入一个正整数: "); scanf("%d", &num); return num; } // 处理偶数 void process_even(int *num) { int t = *num; *num /= 2; printf("%d/2=%d\n", t, *num); } // 处理奇数 void process_odd(int *num) { int t = *num; *num = *num * 3 + 1; printf("%d*3+1=%d\n", t, *num); } // 处理数字,根据规则进行计算并打印结果 void process_number(int num) { while (num != 1) { if (num % 2 == 0) { process_even(&num); } else { process_odd(&num); } } } int main() { int num = read_number(); process_number(num); return 0; }
下面是错误代码示范(错误原因:函数接收的参数值并不是改变后的值)
/** * 下面的解法是错误的,因为此时的num的值在函数调用后并没有把改变后的num的值赋给另一个函数,导致此时调用的num一直是之前未改变的值 */ #include <stdio.h> #include <stdlib.h> // 读取用户输入的数字 int read_number() { int num; printf("请输入一个正整数: "); scanf("%d", &num); return num; } // 处理偶数 void process_even(int num) { int t = num; num /= 2; printf("%d/2=%d\n", t, num); } // 处理奇数 void process_odd(int num) { int t = num; num = num * 3 + 1; printf("%d*3+1=%d\n", t, num); } // 处理数字,根据规则进行计算并打印结果 void process_number(int num) { while (num != 1) { if (num % 2 == 0) { process_even(num); } else { process_odd(num); } } } int main() { int num = read_number(); process_number(num); return 0; }
如果是不把程序分成多个函数,也就是各个功能杂糅在一起也可以正确实现(虽然正确,但是不推荐把功能全部写在主函数中):
#include <stdio.h> #include <stdlib.h> int main() { int num, t; scanf("%d", &num); while (num != 1) { if (num % 2 == 0) { t = num; num /= 2; printf("%d/2=%d\n", t, num); } else { t = num; num = num * 3 + 1; printf("%d*3+1=%d\n", t, num); } } }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复