上周学习总结来啦~~
内容一是 如何计算一个整数的平方根(不能整开就向下取整)
我写的代码如下,利用的算是折半查找吧。。。。不是真正意义的折半,但是有相似之处。
#include<stdio.h>
// 自己定义的开方函数
int sqroot(int n){
int mid;
int first = 1,last;
mid = (first + n)/2;
last = n;
while(1){
//结束条件,mid的平方等于或者是(mid平方小于n但是mid+1的平方大于n)
if(mid * mid <=n &&(mid +1 )* (mid +1)>n)
return mid;
// 不满足上面 只能是mid太小了 所以需要向大区间求中值
else if (mid * mid < n)
{
first = mid;
mid = (mid + last)/2;
//last = mid;
}
//同理,向小区间求中值
else if (mid * mid >n)
{
last = mid;
mid = (mid + first)/2;
}
}
}
int main(){
printf("%d",sqroot(11));
return 0;
}
事实上,我的老师给出了一个非常简短的代码,我理解了好一会。。。
#include <stdio.h>
int sqroot (int n)
{
int x = 1, y;
while (1)
{
y = n/x;
x = (x + y)/2;
if (y == x || y - 1 == x)
return (x);
printf ("%d %d\n", x, y);
}
}
int main ()
{
int n = 1024;
printf ("square root of %d is %d\n", n, sqroot (n));
return (0);
}
这里,老师利用了整数的整除的特性,我们以10为例,可以得到y,x数据分别是:
“y,1”; "10, 5 "; “2,3”,“3,3”。
是不是莫名其妙的就发现x,y相等了,并且也满足题意。
对,我也很莫名其妙。。。。 等待笔者的进一步探索吧。。嘤嘤嘤~~~~
时间复杂度是O(log n)
内容二:分治
这张图片是问题的具体解析。意思就是如何把一个数x的n次幂 改写成由x的二次方组成的乘积。
想法也很简单,就是如图中所示将问题转化成 n与2的关系。
然后进行递归就可以计算了。代码如下:
int power(int x, int n)
{
if(n == 0)
return 1;
if(n%2 == 0)
return (power(x*x,n/2)); //n为偶数,所以是x*x
else
return (power(x*x, n/2)*x);// n为奇数,所以需要再多乘一个x
}
其实这里如果以n=5来进行演示的话,可以看到递归需要到最后一层,每一层中x的值是不同的,同时n的值是倍减的,从x 到 xx 再到当n=0时,返回1;
所以x5次方=x2x2*x;
其实这个代码的时间复杂度是O(log n ),但是还有进一步简化的代码,叫迭代。相关的计算我会放在下次写出来。(大概吧)
但是今天笔者有点累了,就不想具体写了,有不懂的再问吧,因为不久我就要进行一次相关的实验了,所以具体数值我还是等下次再分享吧。
内容三: 求质数(下次见)
思考题目: 下次见
今日的内容来自华科的沈刚老师
(作者:某个崇拜他的学渣)