c语言作业【第六次】
0129
例.对一个二维数组中的数据排序,方法如下:
-
将整个数组中值最小的元素所在行调整为数组第一行,
-
将除第一行外的行中最小元素所在行调整为第2行,
-
将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推
本题需先化简题意,实际上就是找每行中最小的数,再对这些数排序,这些数的顺序就对应这最后每行的排序。所以在对这些每行最小数排序的时候对相对应的行也排序就可以了(也就是两个工作是交替同时进行的)。
老师用了选择排序:
选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
即本代码的48-66行。这边用选择排序也是因为它的性质,每一次即可找到范围内的最小值,就可以顺便把两行的数据对调,没有额外的工作量。(假设是冒泡排序,找到一个最大数它就要进行多次比较,只要有交换数值,对应的两行的数据就会进行交换,相比之下就会麻烦很多。)
同时也涉及到通过随机数生成随机数组的方法:
#include <stdlib.h> //需包含两个头文件
#include <time.h>
srand((unsigned)time(NULL));
int a;
a = rand % 100; //生成0—99的随机数
例.一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
完全平方数是非负数,也就是说0也是。
题意审清,再加上168,所以原来那个数要加上100再加上168。
解法一(最笨的):
参考:https://blog.****.net/baishuiniyaonulia/article/details/77922601
查找的数不应该从0开始,因为加上100是一个完全平方数,完全平方数又不能是非负数,所以查找的数应该从-100开始。
利用while永真循环查找,但我的linux c下while不结束好像一个都不会输出?我就写了个上限10000。
输出结果:
解法二(优化):
参考:https://blog.****.net/UESTCAA/article/details/53191972#commentsedit
首先考虑正整数,负整数类似。
a+100=x*x
x*x+168=y*y
则 (y+x)(y-x)=168,先计算出符合条件的两个因数(m,n)之积等于168,再另
y-x=m;y+x=n则x=(n-m)/2; 最终: a=x*x-100。
输出结果:
可以看到比解法一优化时间不是一点点。
第21,22行,i找到168的平方根即可,不用找到168/2。
第24行,第一次写的是i从0开始,除数不能为0,linux运行报错“浮点数例外”即是提示此错误。
第26行,注意除法,要是想结果得到一个小数,被除数或除数不能都是整数!
解法三:
参考:https://blog.****.net/Q176782/article/details/52963800
解法四:
参考:https://blog.****.net/haohaixingyun/article/details/75258597