2020-09-29

上周学习总结来啦~~
内容一是 如何计算一个整数的平方根(不能整开就向下取整)

我写的代码如下,利用的算是折半查找吧。。。。不是真正意义的折半,但是有相似之处。

#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次方=x2
x2*x;

其实这个代码的时间复杂度是O(log n ),但是还有进一步简化的代码,叫迭代。相关的计算我会放在下次写出来。(大概吧)

但是今天笔者有点累了,就不想具体写了,有不懂的再问吧,因为不久我就要进行一次相关的实验了,所以具体数值我还是等下次再分享吧。

内容三: 求质数(下次见)
思考题目: 下次见在这里插入图片描述

	     今日的内容来自华科的沈刚老师    
	                                      (作者:某个崇拜他的学渣)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值