写在最前面
今天写的这道题其实不难,而且题目几乎把难点都提出来了,但是我还是花了很长时间找bug,真的是老学长大型翻车现场!在定义整形变量的时候直接把scanf()赋值给了这个整型变量结果一直计算不正确,唉,看了好久才发现!scanf()函数正常调用后会返回1.
来看题目!
递归函数求计算次数
输入一个自然数:若为偶数,则把它除以2;若为奇数,则把它乘以3加1。经过如此的有限次运算后,总可以得到自然数值1。求经过多少次运算,可得到自然数1。自然数1,认为经过0次计算得到。
提示,假定参数名为n:
(1)参数是1的时候,固定返回0;
(2)不满足上述条件,且参数是偶数的时候,返回值是f(n/2)+1;
(3)上述两个条件都不满足,返回值是f(n*3+1)+1。
输入格式:
用户输入一个大于等于1的整数。
输出格式:
输出一个正整数。
输入样例:
8
输出样例:
用户输入8的时候,8除以2等于4,4除以2等于2,2除以2等于1。所以从8到1,需要经过3次运算。
3
输入样例:
3
输出样例:
7
先来看看正确的代码:
#include<stdio.h>
int f(int n);
int main(){
int n;
scanf("%d",&n);
printf("%d",f(n));
return 0;
}
int f(int n){
if(n == 1){
return 0;
}else if(n%2 == 0){
return f(n/2)+1;
}
else{
return f(n*3+1)+1;
}
return 0;
}
一开始写错的地方
int n=scanf("%d",&n);
题目里面n是用户输入的数字,要判断这个数经过多少次运算才能变成1,所以给n赋值错了,肯定就计算不出来正确结果!