学习日记-C语言实现pat乙级1001(3n+1)

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.维护和修改程序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值