0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
-
单循环
辗转相除法求最大公约数,利用一层循环结构使a取两数相除的余数,直到a=0退出循环。
猜数字游戏,让读者输入数字,给予一定的提示,不同次数猜中输出的语句不同,猜的次数大于给定的一个数字就跳出循环。
求交错序列和,灵活利用一个flag=1,让它循环一次就换一次符号,达到交错的目的。 -
嵌套循环
求n以内k个素数之和,就利用一个flag=1,来判断是否为输出的第一个数,该数字输出后便使flag=0,进行之后的循环。
输出某个范围内的梅森数,没有要输出None。利用一个count=0,有梅森数时就count++,无时就用一个if条件语句判断count是否等于0。
打印空心对称菱形时,利用math.h的头文件,引用一个abs的函数,能够正确输出前面的空格。字母很行对应的变换也是相同的道理。
1.2 本章学习体会
- 嵌套循环中,老师布置的打印空心菱形的题目不是很懂,看完超星视频后,不明白输出字母的时候,为什么ch-1+mid-abs(mid-i)就可以输出对应的字母。
- 本周代码量不足1000,因为有的时候一道题目会卡很久。
2.PTA实验作业
2.1 题目名1
2.1.1 伪代码
···
/通过对题目的判断可得,每一行前面的空格个数与输出的第一个字母的个数之和是一个恒定的数,为mid=(hight+1)/2。后面的倒序利用绝对值与前面一样输出空格数。/
/利用第一个循环输出每一行前面所对应的空格/
for (j = 1; j <= abs(mid - i); j++)
{
printf(" ");
}
/再利用第二个for循环来判断循环走到的位置是否为每一行的第一个或者是最后一个,是的话输出每一行所对应的字母,不是的话就输出空格。/
for (k = 1; k <= hight - 2 * abs(mid - i); k++)
{
if (k == 1 || k == hight - 2 * abs(mid - i))
{
bh = ch + mid - 1 - abs(mid - i);
printf("%c",bh);
}
else
{
printf(" ");
}
/每输出一行字母后就要换行。/
printf("\n");
···
2.1.2 代码截图
2.1.3 造测试数据
输入数据 | 输出数据 | 备注 |
---|---|---|
B 5 | 输出五行空心菱形 | 正常数据 |
D d | 无 | 异常数据 |
2 2 | 无 | 异常数据 |
2.1.4 PTA提交列表及说明
- 部分正确:每一行所对应的字母输出结果错误,该表达式没有正确表达,使该代码输出的字母为连加效果。
- 部分正确:前面的错误,我通过观看超星平台林老师的视频将其改正,但是前面遗留下来的ch++忘记删除,又导致每一行输出的字母与前面一行输出的字母相差一个字母。
- 答案正确:将前两次的错误进行修改,我觉得自己粗心的毛病还是没有改掉。
2.2 题目名2
2.2.1 伪代码
···
/先定义一个函数数列为Fibonacci数列,即第n项数字为Fibonacci数列的第n项数,输出这个数字。定义第二个函数为输出从m到n的Fibonacci数。/
/输出第N项Fibonacci数/
for (i = 3; i <= n; i++)
{
sum = firstnumber + secondnumber;
temp = secondnumber;
secondnumber = sum;
firstnumber = temp;
}
if (n == 1 || n == 2)
{
return 1;
}
else
{
return sum;
}
/输出两个数之间的Fibonacci的数。/
for (j = 1;; j++)
{
if (fib(j) >= m)
{
if (fib(j) > n)
{
break;
}
if (flag == 0)
{
printf("%d", fib(j));
flag = 1;
count = 1;
}
else
{
printf(" %d", fib(j));
}
}
}
···
2.2.2 代码截图
2.2.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
20 30 7 | fib(7)=13 21 | 数据正常 |
2000 2500 8 | fib(8)=21 | 数据正常 |
0 | 无 | 数异常 |
2.2.4 PTA提交列表及说明
- 答案错误:令fib(sum)输出,所以输出的答案显然是错误的。因为把判断数字是否大于n的数放在末尾,所以末尾多输出了一个fib数。
- 部分正确:第一个函数时,fib的数列是从第三项开始的,没有提出如果第一项或者第二项sum应该输出什么值。
- 答案正确:把sum初始化为1输出结果就是这样的。
2.3 题目名3
2.3.1 伪代码
···
/通过输出的N位数,取N位数的最大数和最小数。用一个for循环i=min;i<=max;i++,里面嵌套一个while循环,取i对应数字用sum求出各个数字N次幂之和。在判断sum与i是否相等。/
for (i = min; i < max; i++)
{
temp = i;
sum = 0;
while (temp > 0)
{
remainder = temp % 10;
sum = sum + pow(remainder, n);
temp = temp / 10;
}
if (sum == i)
{
printf("%d\n", i);
}
}
···
2.3.2 代码截图
2.3.3 造测试数据
输入数据 | 输出数据 | 说明 |
---|---|---|
3 | 153 370 371 407 | 数据正常 |
2 | 没有 | 异常数据 |
7 | 1741725 4210818 9800817 9926315 | 数据正常 |
2.3.4 PTA提交列表及说明
- 答案错误:使用while循环输出N位数的最大数以及最小数,循环过多。
- 部分正确:利用switch(N)将min和max直接输出,解决循环过多超时问题。利用for循环while循环判断i是否满足水仙花数的条件。
- 部分正确:当N位7时,输出的数字已经超出int的范围。
- 部分正确:把N等于7情况单独的列出,直接输出7位数的水仙花数。
- 多种错误:sum没有初始化,输出条件放错。
- 答案正确:将7位数的水仙花数直接输出放在最前面,后面的循环条件修改为>0,把sum初始化为0。
3.代码互评
同学的代码
我的代码
互评:1.同学代码,找到解题关键,列出表达式;我的代码,列举一种一种的情况,笨方法。
2.同学代码,代码按照不同的功能区域化,可读性强;我的代码,挤在一块,不易修改错误。
同学代码
我的代码
互评:1.同学代码,兔子跑得快时,直接让乌龟的距离加90米,时间加30分钟;我的代码,兔子跑的快休息30分钟时,让乌龟一分钟一分钟加,兔子利用一个flag让它的距离不变。我的运行时间会更多一点。
2.同学代码,要判断加了三十分钟后会不会超过输入的时间;我的代码,一分钟一分钟加上去的就不用判断会不会超过时间。这里我的代码比同学代码要缩减一个步骤。