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]==''  then  
		    num1[i]='0';
		if num2[i]==''  then  
		    num2[i]='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,使得两个数字位数相同

4.代码互评

4.1 代码截图

  • 同学

  • 自己

4.2 二者的不同

1.同学的做法是找到每行的最大值,然后直接比较每行的最大值是否为该列的最小值;而我的做法是分别找出每行的最大值和每列的最小值,然后对比两者是否为同一个
2.同学借助两个变量flag和flag1进行判断,而我是借助两个数组,方法上同学的方法更加的简洁,但我会觉得容易出错

原文地址:https://www.cnblogs.com/qq1191834402/p/10088768.html