C语言博客作业04--数组
1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
本章学习了数组,学习了解了几种数组,也学会通过数组来解决问题。刚开始学习一维数组时觉得难度不是很大,但继续学习了二维数组、字符数组后就感受到了难度,完成PTA不知道如何下手,或是运行错误或者答案错误不知如何解决,后面通过询问同学,学习同学的代码来解决问题,也提高了自己。
1.2.2 代码累计
2.PTA总分
2.1截图PTA中三次题目集的排名得分
2.2 我的总分:
200+105+150=455
3.PTA实验作业
3.1 PTA题目1
新浪微博中一奇葩贴:“我出生于1988年,直到25岁才遇到4个数字都不相同的年份。”也就是说,直到2013年才达到“4个数字都不相同”的要求。本题请你根据要求,自动填充“我出生于y年,直到x岁才遇到n个数字都不相同的年份”这句话。
3.1.1 算法分析
定义函数Num(int year);
主函数
定义 年份year,要求n,年龄i;
输入出生年份,要求;
for i=0 to do
调用函数Num(int year);
if Num(year+i)==n end for
输出 年龄i,年份year;
函数Num(int year)
定义 个位one,十位ten,百位hundred,千位thousand;
定义数组num[10] 并初始化;
提取并统计年份的各个位的数字;
if num[one]==4||num[ten]==4||num[hundred]==4||num[thousand]==4 then
return 1;//满足没有不同数字
if num[one]==3||num[ten]==3||num[hundred]==3||num[thousand]==3 then
return 2;//满足只有2个不同数字
if num[one]==1&&num[ten]==1&&num[hundred]==1&&num[thousand]==1 then
return 4;//满足有4个不同数字
if num[one]==1||num[ten]==1||num[hundred]==1||num[thousand]==1 then
return 3;//满足有3个不同数字
3.1.2 代码截图
3.1.3 PTA提交列表及说明
Q1:不清楚不足四位的数字如何补0
A1:后来通过搜索知道了使用%04d可以解决问题
Q2:运行时出现答案错误或者运行超时
A2:通过阅读代码及调试发现只有3个不同数字的条件放在前面时,满足有4个不同数字条件的数字也可以满足只有3个不同数字的条件,将4个不同数字的if条件语句放在前面就可以解决
3.2 PTA题目2
一个矩阵元素的“鞍点”是指该位置上的元素值在该行上最大、在该列上最小。本题要求编写程序,求一个给定的n阶方阵的鞍点。
3.2.1 算法分析
定义 行列数n,i,j,k,判断flag=0;
定义 数字数组number[6][6],判断数组flag1[6][6],判断数组flag2[6][6];
输入行列数n;
通过循环输入数组number[6][6];
for i=0 to n-1 do
for k=0 to n-1 do
if number[i][k]>number[i][j] then
flag1[i][j]=1;//判断并将除该行最小的数字外对应的位置赋值为1
for k=0 to n-1 do
if number[k][j]<number[i][j] then
flag2[i][j]=1;//判断并将除该列最大的数字外对应的位置赋值为1
for i=0 to n-1 do
for j=0 to n-1 do
if flag1[i][j]==0&&flag2[i][j]==0 then
printf("%d %d",i,j);
flag=1;//判断是否有满足条件的数字,有则输出下标
if flag==0 then
printf("NONE");//没有则输出 NONE
3.2.2 代码
3.2.3 PTA提交列表及说明
Q1:刚开始没有看清题目的意思,简单的认为只是找方阵中最小值及输出时惯性思维认为输出数字
A1:当提交之后显示答案错误后发现了问题所在
3.3 PTA题目3
输入2个大数,每个数的最高位数可达1000位,求2数的和。
3.3.1 算法分析
定义 函数Reverse(char a[]);
主函数
定义 数组长度len,i=0;
定义 字符数组num1[100],字符数组num2[100],数字数组result[1000];
if strlen(num1)>strlen(num2) then
len=strlen(num1);
else then
len=strlen(num2);//取更长数组的长度
调用函数 Reverse(num1);
调用函数 Reverse(num2);
for i=0 to len-1 do
{
if num1[i]=='\0' then
num1[i]='0';
if num2[i]=='\0' then
num2[i]='0';//当数组中的字符不足部分,转'\0'为0
result[i]=result[i]+(num1[i]-'0')+(num2[i]-'0');//进行运算
if result[i]>9 then
result[i]-=10;
result[i+1]++;//当数字超过10需进位
}
if result[len]!=0 then
len++;//判断头位是否需要进位
输出结果
函数Reverse(char a[])//将数组逆序,如123转为321
定义 长度len,第一位top=0,最后一位bottom;
定义字符 temp;//用于交换
len=strlen(a);//取数组长度
bottom=len-1;
while bottom>=top do
temp=a[top];
a[top]=a[bottom];
a[bottom]=temp;
top++;
bottom--;//利用循环将数组头尾交换
3.3.2 代码
3.3.3 PTA提交列表及说明
Q1:两个数字位数不一定相同
A1:运用函数,将两个数字进行逆序,便于运算
Q2:当运算位数不同时,出现部分部分正确
A2:因为位数不同,不能进行完整的运算,通过将位数较小的数字不足的部分的'\0'转换成0,使得两个数字位数相同
4.代码互评
4.1 代码截图
-
同学
-
自己
4.2 二者的不同
1.同学的做法是找到每行的最大值,然后直接比较每行的最大值是否为该列的最小值;而我的做法是分别找出每行的最大值和每列的最小值,然后对比两者是否为同一个
2.同学借助两个变量flag和flag1进行判断,而我是借助两个数组,方法上同学的方法更加的简洁,但我会觉得容易出错