Pat乙级1001 害死人不偿命的(3n+1)猜想
第一次做题,昨天用了差不多2个多小时才写出,结果最后一个编译点不通过。今天早上修改后,全部通过了。
最终通过代码:
#include <stdio.h>
int main(void)
{
int n = 0;
int count = 0;
scanf("%d", &n);
while (n>1)
if (n % 2 == 0)
{
n /= 2;
count++;
}
else
{
n = ((3 * n) + 1) / 2;
count++;
}
printf("%d", count);
return 0;
}
通过之后,再看了下别人写的之后,由衷感叹他们写的那么精简强悍。
发现:这里可以写一个函数来进行卡拉兹猜想的运算!这样在main函数中,一目了然,增加了程序可读性,代码也大大精简!
做题过程
第一天最后提交的代码(最后一个监测点不通过):
/* pat 1.害死人不偿命的(3n+1)猜想 */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int n = 0;
int count = 0;
scanf("%d", &n);
//if (n == 1)
//{
// printf("i=0");
// return;
//}
//if (n == 0)
//{
// printf("i=0");
// return;
//}
while (n>1)
if (n % 2 == 0)
{
n /= 2;
count++;
}
else
{
n = ((3 * n) + 1) / 2;
count++;
}
printf("%d\n", count);
return 0;
}
这里第一天写时绕住了,看到检测点1,2,3,4,以为检测的数据就是1,2,3,4这些;忘了n = 1 和n = 0 都是0步!写了两个if上去,今天再打开页面看题后才发现竟然犯了这弱智错误!!不需要写那两个if!
但是删掉以后,依然最后一个点无法编译通过;代码也实在不知道该咋整了,突然想起第一次提交时,本地编译没问题,但一提交全是错误,因为pat这个oj平台很严谨,所以输入输出不要加别的说明和转义字符上去,删掉了输出printf("%d\n", count);
语句中的转移字符\n后再次提交,全部通过了。
做题思路:
1.无论中间过程怎么样,最后都是要得到n = 1;
2.得到n = 1只有两种步骤,是偶数则(n / 2),是奇数则(3 * n + 1) / 2;
3.由上得出要用到循环和选择(分支)语句;
4.一开始用for和if,发现测试条件和自增那里不好写,然后用while则很方便
5.用while和if嵌套实现了得到n = 1;
6.得到n = 1;测试了几个数成功后,接下来就是想如何记录步骤;
7.想到不论是执行是偶数还是是奇数的运算,都算是一步,所以每次运算完后都自增1;
总结体会
应该在仔细读题之后,先想出大概的流程,可能要用到的语句等;然后把步骤一步步写下来,再想着如何用代码去实现。(把自己当成计算机)
我在一开始时就直接去写,导致写的途中发现不行又换思路等,各种细节也总是遗漏出错!
因该像书上这样:
1.定义程序的目标->2.设计程序->3.编写代码->4.编译->5.运行程序->6.测试和调试程序->7.维护和修改程序