c语言作业【第六次】

0129

例.对一个二维数组中的数据排序,方法如下:

  1. 将整个数组中值最小的元素所在行调整为数组第一行,

  2. 将除第一行外的行中最小元素所在行调整为第2行,

  3. 将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推

c语言作业【第六次】

c语言作业【第六次】

本题需先化简题意,实际上就是找每行中最小的数,再对这些数排序,这些数的顺序就对应这最后每行的排序。所以在对这些每行最小数排序的时候对相对应的行也排序就可以了(也就是两个工作是交替同时进行的)。

老师用了选择排序

选择排序(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。

c语言作业【第六次】

 输出结果:

c语言作业【第六次】

 

解法二(优化):

参考: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。

c语言作业【第六次】 输出结果: 

c语言作业【第六次】

可以看到比解法一优化时间不是一点点。

第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