作业三

这个作业属于哪个课程
https://edu.cnblogs.com/campus/zswxy/CST2020-3/
这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2020-3/homework/11454
这个作业的目标 掌握新的循环语言
学号 20209009

 

 

 

1.PTA实验作业

1.1 求平方根序列前N项和

—— 题目内容描述:计算平方根序列√1+√2+√3+⋯的前N项之和。可包含头文件math.h,并调用sqrt函数求平方根。

1.1.1实验代码截图

 

 

 

1.1.2数据处理

利用循环语句不断累加

1.1.3 PTA提交列表及说明

 

 

 

1.2 求简单交错序列前N项和

—— 题目内容描述: 计算序列 1 - 1/4 + 1/7 - 1/10 + ... 的前N项之和。

1.2.1 实验代码截图

 

 

1.2.2 数据处理

使用了简单的for语句进行循环

1.2.3 PTA提交列表及说明

 

 

 

1.3 求分数序列前N项和

—— 题目内容描述:计算序列 2/1+3/2+5/3+8/5+... 的前N项之和。注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子。

1.3.1 实验代码截图

1.3.2 数据处理

利用了sum变量

1.3.3 PTA提交列表及说明

 

 

 

 

2.阅读代码

题目要求:找一份优秀代码,理解代码功能,并讲出你所选代码有点及可以学习的地方

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<time.h>
#include<string>
#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.a==b.a&&a.id<b.id);
}
int qmod(int a,int b,int c)
{
    int res=1;
    while(b)
    {
        if(b&1)
            res=((LL)res*a)%c;
        a=((LL)a*a)%c;
        b>>=1;
    }
    return res;
}
int main()
{
    while(scanf("%d%d%d",&p,&b,&n)!=EOF){
        int m=sqrt(p*1.0);
        while(m*m<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(i==0||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);
    }
}
总结:
1.利用了大量的循环语句和条件语句相互配合
2.思路清晰,简洁明了

3.学习总结

3.1 学习进度条

周/日期 这周所花的时间 代码行 学到的知识点简介 目前比较迷惑的问题
11.2-11.8 21h 156
if-else语句,for循环
数列的组合与应用

3.3 学习感悟

1.仿佛可以看到一个软件的生成的内部结构慢慢在我面前展开,展现出代码的魅力

2.语言的相通性

 

posted @ 2020-11-08 11:41  黯然默然  阅读(93)  评论(4编辑  收藏  举报