这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 作业要求的链接 |
这个作业的目标 | 1.要求学生掌握使用for循环语句;2.加深我们对所写代码的理解;3.总结这两周的学习。 |
学号 | 20209188 |
1.PTA实验作业
1.1 求平方根序列前N项和
—— 题目内容描述:计算平方根序列√1+√2+√3+⋯的前N项之和。可包含头文件math.h
,并调用sqrt
函数求平方根。
1.1.1实验代码截图
1.1.2数据处理
-
数据表达:使用了浮点型sum与整数型N
-
数据处理: sum使用了一个反复相加,使用了循环结构
1.1.3 PTA提交列表及说明
-
调用pow函数忘记输入 #include<math.h> 头文件
-
没有看清题目要求,输出结果没有保留小数点后两位
1.2 求简单交错序列前N项和
—— 题目内容描述: 计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。
1.2.1 实验代码截图
1.2.2 数据处理
-
数据表达:使用了三个变量,一个整数型N,两个浮点型n,sum
-
数据处理:使用了简单的循环结构
1.2.3 PTA提交列表及说明
-
码代码时把 printf 放在了 for 循环中
-
一开始没有使用 &,导致报错
1.3 求分数序列前N项和
—— 题目内容描述:计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。
1.3.1 实验代码截图
1.3.2 数据处理
-
数据表达:使用了整数型 N,i,和浮点型 sum , num1 , num2 , z
-
数据处理:使用了简单的循环结构
1.3.3 PTA提交列表及说明
-
一开始num1,num2的初始赋值错误,导致输出结果错误
-
一开始没有全部使用了整数型
-
一开始没有看清题目,分子分母的特点没看清,以为只是简单的叠加变数
2.阅读代码
题目要求:找一份优秀代码,理解代码功能,并讲出你所选代码有点及可以学习的地方
代码如下:
include
include
include
include
include
include
include
include
include
include<time.h>
include
define cl(a,b) memset(a,b,sizeof(a))
define max(x,y) ((x)>(y)?(x):(y))
define min(x,y) ((x)<(y)?(x):(y))
define REP(i,n) for(int i=0;i<n;++i)
define REP1(i,a,b) for(int i=a;i<=b;++i)
define REP2(i,a,b) for(int i=a;i>=b;--i)
define MP make_pair
define LL long long
define ULL unsigned long long
define X first
define Y second
define MAXN 100050
using namespace std;
int p,b,n;
struct node
{
int a,id;
}q[MAXN];
bool cmp(node a,node b)
{
return a.a<b.a||(a.ab.a&&a.id<b.id);
}
int qmod(int a,int b,int c)
{
int res=1;
while(b)
{
if(b&1)
res=((LL)resa)%c;
a=((LL)aa)%c;
b>>=1;
}
return res;
}
int main()
{
while(scanf("%d%d%d",&p,&b,&n)!=EOF){
int m=sqrt(p1.0);
while(mm<p)m++;
int res=1;
int tail=0;
int a=qmod(b,m,p);
for(int i=0;i<=m;++i)
{
q[tail].id=i;
q[tail++].a=res;
res=((LL)res*b)%p;
}
sort(q,q+tail,cmp);
int h=0;
for(int i=0;i<tail;++i)
{
if(i0||q[i].a!=q[i-1].a)
{
q[h++]=q[i];
}
}
int flag=0,ans;
res=n;
int ra=qmod(a,p-2,p);
for(int i=0;i<=m;++i)
{
int l=0,r=h-1;
while(r-l>1)
{
int mid=(l+r)>>1;
if(q[mid].a>res)r=mid;
else l=mid;
}
int pos=-1;
if(q[l].a==res)pos=l;
if(q[r].a==res)pos=r;
if(pos!=-1){
ans=i*m+q[pos].id;
flag=1;
break;
}
res=((LL)res*ra)%p;
}
if(flag==0)puts("no solution");
else
printf("%d\n",ans);
}
}
——优点:
-
带代码的可读性高,变量的作用清晰明了
-
思路清晰,多种可能都想到了
-
运用多种判断,循环语法,把每一种语法的优点都发挥出来了
-
运用了多种头文件,每一种头文件所拥有的函数的作用都有运用
——所学到的:
-
做题前要把思路想清,要把所要使用的头文件都提前想好
-
多用英文命名变量,是代码的可读性变高
-
代码的使用要正确,多种语法都要熟记于心
3.学习总结
3.1 学习进度条
周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
---|---|---|---|---|
第8周/10.19~10.25 | 36 h | 410 | if-else语句,for循环 | 无 |
第9周/10.26~11.1 | 36 h | 840 | 数组的运用 | 二维数组的输入,和输出不太了解 |
第10周/11.2~11.6 | 36 h | 1290 | 本周复习 | 函数的定义不理解 |
![]() |
3.2 累积代码行和博客字数
3.3 学习感悟
-
通过几周的学习我深刻认识到了程序的魅力所在,尤其在写作业时可以使用不同的语句,但其在代码里面所代表的含义是一样的
-
以前命名变量时没有考虑代码的可读性,但通过阅读一些好的代码我明白了代码可读性的重要性