P1001 害死人不偿命的(3n+1)猜想 (Basic Level)
转跳点:🐏
为了考浙江的研究生,我来被PAT虐一下,PAT这是PAT最简单的等级——乙。好了,话不多说,看题。
作为入门级别,第一题还是很友好的。题目一遍下来整个代码的就出来了,比水仙花数还简单。说一下思路:
首先先看看要我们干什么,哦,n经过几次卡拉兹猜想才能到1,n - > 1, 那应该要个循环。
那什么是卡拉兹猜想,题目里说了,我就不重复了。从卡拉兹猜想很容易就可以知道 是两个选择条件。
结合上面所有得出就可以快速的写出代码了。
实现:
1 #include <stdio.h> 2 3 int main() 4 { 5 int num; 6 7 while (~scanf("%d", &num)) 8 { 9 int count = 0; 10 while (num != 1) 11 { 12 if (num % 2) 13 { 14 num = (3 * num + 1) / 2; 15 } 16 else 17 { 18 num /= 2; 19 } 20 count++; 21 } 22 printf("%d\n", count); 23 } 24 return 0; 25 }
这道题还有递归解法
1 #include <stdio.h> 2 3 int callatz(int num); 4 int count = 0; 5 int main() 6 { 7 int num; 8 9 while (~scanf("%d", &num)) 10 { 11 count = 0; 12 printf("%d\n", callatz(num)); 13 } 14 return 0; 15 } 16 int callatz(int num) 17 { 18 if (1 == num) 19 { 20 return count; 21 } 22 if (num % 2) 23 { 24 callatz((num * 3 + 1) / 2); 25 } 26 if (!(num % 2)) 27 { 28 callatz((num / 2)); 29 } 30 return ++count; 31 }
前路多艰,诸君共勉。
大道五十,天衍四九,人遁其一!