解题思路:
角谷猜想:任给一个自然数,若为偶数除以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语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:656 |
简单的a+b (C语言代码)浏览:764 |
C语言训练-斐波纳契数列 (C语言代码)浏览:1270 |
大小写转换 (C语言代码)浏览:904 |
WU-小九九 (C++代码)浏览:1713 |
C语言程序设计教程(第三版)课后习题6.3 (C语言代码)from DQM浏览:773 |
1012题解浏览:938 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:569 |
矩阵转置 (C语言代码)浏览:855 |
小O的图案 (C语言代码)浏览:979 |