C语言I博客作业02
| 这个作业属于哪个课程 | <班级的链接> |
|---|---|
| 这个作业要求在哪里 | <作业要求的链接> |
| 这个作业的目标 | <学习不同的使用不同的代码求解> |
| 学号 | <20208924> |
1.PTA实验作业(15分/题)
从PTA题目集中选出3个你最满意的题目完成以下内容,选择题目难度越大,分值越高,每题2分,内容要求如下:
1.1计算火车运行时间
题目内容:输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
1.1.1实验代码截图

1.1.2数据处理
数据表达:用了x,y,a,b为变量,值是通过定义的函数,整数型。
数据处理:表达式有if-else,循环结构和顺序结构。
1.1.3 PTA提交列表及说明

Q1:为什么答案错误。
A1:没有考虑小于一个小时的情况。
Q2:怎么表示时间的代码?
A2:简单用数学方法计算时间。
1.2 阶梯电价
题目内容:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费
1.2.1实验代码截图![]()
1.2.2 数据处理
数据表达:用c为变量,借用已有数据,float类型。
数据处理:表达式有if-else,循环结构和顺序结构。
1.2.3 PTA提交列表及说明

Q1:是一开始不知道输出的规则?
A1:对
Q2:为什么还是错了?
A2:少算了当电费小于零的情况
1.3 题目2求奇数分之一序列前N项和
题目内容:计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
1.3.1 实验代码截图

1.3.2 数据处理
数据表达:用了a,b,i,n,item,sum为变量,借用已有数据和自己测的数据,整数型和浮点型。
数据处理:表达式for循环结构。
1.3.3 PTA提交列表及说明

Q1:第一次错误的原因?
A1:没有注重细节,计算sum的算式中没有*1.0。
Q2:这样运用for循环结构?
A2:要有表达式1,表达式2,表达式3,才能正常的运行。
2.阅读代码(-5——5分)
#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.这段代码运用:while-for语句、if-else语句、分支语句,有循环结构和基础数据类型,指定次数的循环程序设计,运用了算数运算和赋值运算。
3.学习的地方:运用数学知识与计算机的知识两者相互融合,这样能够帮助我写程序,我也发现到他们对待格式的要求是非常严格的,我也应该学这种对待代码的好习惯。
3.学习总结(15分)
3.1 学习进度条(5分)
| 周/日期 | 这周所花的时间 | 代码行 | 学到的知识点简介 | 目前比较迷惑的问题 |
|---|---|---|---|---|
| 第八周 | 34 | 432 | 初步了解了C++什么,干什么的 | 以后能干什么 |
| 第九周 | 47 | 633 | 学会了C语言的基本数据类型 | 有很多的代码不能理解什么含义 |
| 第十周 | 65 | 1323 | 学会了for语句 | 已经了解了C语言的1%,还需要慢慢去练习 |
3.2 累积代码行和博客字数(5分)

3.3 学习感悟(5分)
学会了for语句,对于代码的理解多了几分,可以用不同的方法去解同样的题,我在学习中不断理解代码的含义,不断累积经验,为以后的学习打好扎实的基础,希望以后能在这个方向有建树。

浙公网安备 33010602011771号