C语言博客作业04--数组

1.本章学习总结

1.1 思维导图

1475050-20181125152539322-776264106.png

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

在这段时间里我们学习了数组的有关内容,有以下几点体会

1.定义数组时后其中的所以元素会被随机赋值,可以加上static将其中的所以元素初始化为0
2.在有序的数组中查找指定元素时可以用二分法以减少查找时间
3.在查找重复数字时可以再定义一个数组,以空间换取时间
4.对数组进行排序时,不同方法的速度不一致,对于较大n时快速排序会优于其他方法但较为不稳定

1.2.2 代码累计

代码量(行)
12851

2.PTA总分

2.1截图PTA三次题目集:一维数组、二维数组和字符数组共3次题目集的排名得分

1475050-20181125155034692-1833396146.png
1475050-20181125155103621-656048063.png
1475050-20181125155144142-52676836.png

2.2 我的总分:200+105+150=455

3.PTA实验作业

3.1 PTA题目1

  • 所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。

3.1.1 算法分析

定义一个数组num[10][10]
定义整型变量 N,m,n,i,j
定义整型变量 a,b,c,d //用于控制方阵每一圈的循环输入
定义整型变量 x,y //用于表示方阵每一个数的位置
输入N
if N为偶数 then n=N/2
else n=N/2+1 //将方阵分为n圈输入
end if
a=N,b=c=N-1,d=N-2;
x=y=0;
m=1;
for j=1 to n do 
    for i=1 to a do//向右
                num[x][y++]=m++;
    end for
    x++;y--;
    for i=1 to b do//向下
        num[x++][y]=m++;
    end for
    x--;y--;
    for i=1 to c do//向左
        num[x][y--]=m++;
    end if
    x--;y++;
    for i=1 to d do//向上
        num[x--][y]=m++;
    end if
    x++;y++;
    a,b,c,d的值都减2
end if
输出方阵 

3.1.2 代码截图

1475050-20181125192024811-1196012236.png
1475050-20181125192104273-1569774466.png

3.1.3 PTA提交列表及说明

1475050-20181125161957761-1040929479.png

  • 这道题是让我头疼比较久的一道题,想了不少方法但都失败了,最后想到将方阵按圈输入才解决了这道题

3.2 PTA题目2

  • 本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

3.2.1 算法分析

定义字符数组a[10001],b[10001]
定义整型数组hash[130]并将其所有元素赋初值0
定义整型变量i
输入字符串a,b
for i=0 to 10000 do
    if b[i]=='\0' then 退出循环
    end if
    hash[b[i]]++;//把b中的元素用hash记录一遍 
 end for
 for i=0 to 10000 do
    if a[i]=='\0' then 退出循环
    end if
    if hash[a[i]]==0 then 输出a[i]
    end if //如果a[i]不为b中的元素则输出a[i]
end for 

3.2.2 代码截图

1475050-20181125164914973-1496332019.png

3.2.3 PTA提交列表及说明

1475050-20181125165025836-100003269.png

  • 这道题算是哈希查找的一个比较灵活的应用,哈希查找不仅可以用来查找重复数字,还可以用来查找重复字符,只不过我在一开始做这道题时忽略了\0才导致了有一个测试点出错,将数组长度由10000改为10001就全部正确了

3.3 PTA题目3

  • 输入2个大数,每个数的最高位数可达1000位,求2数的和。

3.3.1 算法分析

void Plus(char *a,char *b,int m,int n);
int main()
{
    定义字符数组a[1001],b[1001]
    定义整型变量i,j,k,c,d;
    以字符串的形式输入两个大数a,b
    获取a,b的长度分别赋值给c,d
    if c>d then Plus(a,b,c,d)
    else Plus(b,a,d,c)
    end if 
} 

Void Plus(char *a,char *b,int m,int n)
{
    定义整型变量i,j;
    i=m-1;
    for j=n-1 to 0 do
        a[i]=a[i]+b[j]-'0';//从个位开始相加 
        if a[i]>'9' then//判断是否要进位 
            a[i]-=10;
            if i-1 >=0 then a[i-1]+=1//判断进位的是否为最高位 
            else 输出一个1
            end if
        end if
    end for
    输出a 
}

3.3.2 代码截图

1475050-20181125184634131-337640258.png
1475050-20181125185421392-829116176.png

3.2.3 PTA提交列表及说明

1475050-20181125184735649-1466229984.png

  • 这道题本身难度不算大,只有最高位进位的问题让我多思考了一会了,因为最高位进位按照我的做法是无法储存在数组中的,只好另外输出

4.代码互评

4.1 代码截图

  • 粤翰同学的代码
    1475050-20181125190736650-167838232.png
    1475050-20181125190912752-118987417.png

  • 我的代码
    1475050-20181125192433060-1409435473.png
    1475050-20181125192512116-1322988531.png

4.2 二者的不同

  • 1.两种方法均为正确解法且效率差距不大,但粤翰同学所用的变量比较少
  • 2.粤翰同学的代码的赋值是在前一个数的值上加一,必须在对第一个数进行另外的处理
  • 3.我的代码是用m来表示要赋予的值,用x,y来表示数的位置,会更加的直观

转载于:https://www.cnblogs.com/xycm/p/10015771.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值