C语言I博客作业05
| |
---|:--😐---:
|这个作业属于那个课程| C语言程序设计II
|这个作业要求在哪里| https://i.cnblogs.com/EditPosts.aspx?opt=1
|我在这个课程的目标是| 精通c语言
|这个作业在那个具体方面帮助我实现目标| 学会了用函数结构简化数学问题,优化程序运行
|参考文献 |c语言程序设计
1.PTA实验作业(20分/题)
从PTA题目集中选出2个你最满意的题目完成以下内容,选择题目难度越大,分值越高,每题20分(每项5分),内容要求如下:
1.1 题目名1
6-1 判断一个整数的各位数字平方之和能否被5整除 (10 分)
编写函数fun,其功能是:判断一个整数的各位数字平方之和能否被5整除,可以被5整除则返回1,否则返回0。
函数接口定义:
int fun(int n );
其中 n 是用户传入的参数。 函数判断n的各位数字平方之和能否被5整除,能被5整除则返回1,否则返回0。
裁判测试程序样例:
include <stdio.h>
int fun( int n );
int main()
{
int m;
scanf("%d", &m);
printf("The result is %d\n", fun(m));
return 0;
}
/* 你的程序将被嵌入在这里 */
输入样例:
12
输出样例:
The result is 1
输入样例:
123
输出样例:
The result is 0
1.1.1数据处理
本题的重点是判断一个整数的各位数字平方之和能否被5整除,所以本题的主要思路为将整数的各个位上的数分离出来;
1.所以我采用了余数%,n%10可以得到个位上的数
2.用n=n%10将个位去掉,并且十位变为个位,运用for循环如此循环即可
3.按照题目的要求,在循环过程中将各个位上的数平方并相加
4.最后只用用if判断是否能被5整除即可
1.1.2实验代码截图
1.1.3 造测试数据
|输入数据 |输出数据 |说明
|:--|:--😐:--😐--:
| 1 | 0|个位,不能5整除
|12| 1|两位数,能被5整除
|123|0|三位数,不能被5整除
1.1.4 PTA提交列表及说明
本次题目的错误只有部分正确,编译错误是下一题的
Q:本次部分正确主要是因为我只考虑到题目最多只用到了三位数,所以我的试子仅仅只能用于计算三位数及以下的数,因此报错,而一开我只做了一些不痛不痒的小改动,对代码没有什么本质上的影响,因而出现了这么多的部分正确
A:在意识到需要考虑到更多位数时,我采用了for循环以将多位数拆解
1.2 题目2
本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。
函数接口定义:
int prime( int p );
void Goldbach( int n );
其中函数prime当用户传入参数p为素数时返回1,否则返回0;函数Goldbach按照格式“n=p+q”输出n的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。
裁判测试程序样例:
include <stdio.h>
include <math.h>
int prime( int p );
void Goldbach( int n );
int main()
{
int m, n, i, cnt;
scanf("%d %d", &m, &n);
if ( prime(m) != 0 ) printf("%d is a prime number\n", m);
if ( m < 6 ) m = 6;
if ( m%2 ) m++;
cnt = 0;
for( i=m; i<=n; i+=2 ) {
Goldbach(i);
cnt++;
if ( cnt%5 ) printf(", ");
else printf("\n");
}
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
89 100
输出样例:
89 is a prime number
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97,
1.2.1 数据处理
本题要处理的函数有两个,一个为素数的判断,另一个为验证哥德巴赫猜想
1.因为验证哥德巴赫猜想需要素数,所以我们先将素数判断出来,其方法为先将1返回0,再从2开始将i变量++,找能否出现将输入的p值整除的值,有则返回1,否则返回0;
2.之后我们要验证哥德巴赫猜想,首先要用if语句和for循环将不小于6的偶数找出来,然后利用第一个函数将该偶数分成两个素数相加即可;
3.将if语句与for循环结构结合,即可按照题目的一排满5换行
1.2.2 实验代码截图
1.2.3 造测试数据
|输入数据 |输出数据 |说明
|:--|:--😐:--😐--:
| 89 100 | 89 is a prime number90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79 ,100=3+97, |题目所给>6
| 1 6 | 6=3+3 |n=6
|1 5 | / |n<6
1.2.4 PTA提交列表及说明
Q:本题的两个编译错误分别是少打;和if中的判断语句我打成了=
A:改掉即可,要注意=与的区别,=是赋值,==是判断
Q:这个部分正确主要是因为将数打错了
A:这种错误以后一定要避免
2.代码互评(5分)
找2份同学代码,和自己代码比较,建议互评代码尽量找代码风格差异较大。
17-4 求组合数
同学代码截图
自己代码截图
在主句中存在一个明显的不同,那便是该同学多设置了一个变量,并使用了for循环,在我观察后发现了这个循环并没有起到任何作用,因为循环结构中仅仅只有i变量有变化,而i对循环中的试子的任何变量都不会产生影响,所以完全不需要循环,其他部分都是大同小异。
6-1 判断一个整数的各位数字平方之和能否被5整除
同学代码截图
自己代码截图
此题我与该同学的第一个区别为我使用的是while循环,而该同学用的是do while循环;这两个循环的区别为while是先判断条件,后进行运算。do while则是反过来;
由于我的循环是先判断,因此我的终止条件又有所不同;
第二处不同则是该同学的return为变量,这使得代码所占的内存相对会多一点
3.学习总结(15分)
3.1 学习进度条(5分)
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第一周 | 2h | 72 | 输出 | 对于输出的符号还不熟 |
第二周 | 3.5h | 57 | 计算 | 算法陌生 |
第三周 | 3.5h | 81 | 分支结构 | 分支的逻辑理不清 |
第四周 | 1.5h | 180 | for循环,+= | 终止条件理不清 |
第五周 | 2h | 600 | 函数结构 | 对于算法的处理比较迷惑 |
3.2 累积代码行和博客字数(5分)
3.3 学习内容总结和感悟(5分)
3.3.1 学习内容总结
3.3.2 学习体会
本次的pta给我的最大感受就是吃力,而造成吃力的最大原因便是对C语言算法的不理解,由此看出我还需努力;并且在学习中我还是了解到了有效的缩短循环结构中的取值范围是可以提高运行效率以及减小内存大小,也因此我在练习将计算公式转化成C语言算法时,还要努力学会有效缩短取值范围;并且像第4题在这种写起来相对较长的代码看懂很是吃力,因此这方面也是需要提升的。