1.解决的办法:
1.暴力算法
2.二分算法
3.牛顿迭代算法
2.算法思路的解析
1. 暴力算法:
建立一个循环 从0 开始 ,一直到 x ,在循环的时候做一个特判,判断,循环的数,是否等于这个数(直接返回这个整数) ,还是大于i * i > x (返回 i-1 )
2.二分算法:(看代码)
开始 直接定义两个标记点 左边 left =0 右边right = x
算法思想: 找数据的中心(mid) 来对比数据 如果 数据大一点 右边的标点的值 左移 到mid -1
如果 数据小了 左边的值的值等于 mid +1
0 x
0 x/2 mid =0 + x/2 mid * mid <x right = mid-1
0 x/4 mid = 0+ x/4 mid * mid <x right = mid-1
3.牛顿迭代算法(看代码)
算法思想: 利用关系式 n= x/n ;
最靠近的数是 (n+x/n)/2 他的数值会逐渐接近我们要求的值
利用递归 的思想
比如说 24
1 * 24 / res = 25/2 =12 ---> 递归 (n+ x/n)
2 * 12 / res =14/2=7
3 * 7 /res =10/2 =5
4 * 5 / res =9/2 =4 ==> 输出
比如说 12
1* 12 /res = 13/2 =6 --->递归
2 *6 /res = 8/2 =4 ==> 输出
代码:
/*************************************************
作者:she001
时间:2022/8/22
内容: 解决 求整数的x 的平方根 (平方根的整数部分)
1.暴力算法
2.二分算法
3.牛顿迭代算法
***************************************************/
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<stdbool.h>
#include<string.h>
//暴力算法
//看是否 n 的乘积是否 等于 x 或者 n的乘积 大于x
int fangfa_1(int x)
{
if(x==0)
{
return 0;
}
else
{
for(int i=1;i<x;i++)
{
if(i*i==x)//等于直接返回 i
{
return i;
}
if(i*i>x)//大于直接返回 i-1
{
return i-1;
}
}
}
}
//二分算法
/*
算法思想: 找数据的中心(mid) 来对比数据 如果 数据大一点 右边的标点的值 左移 到mid -1
如果 数据小了 左边的值的值等于 mid +1
0 x
0 x/2 mid =0 + x/2 mid * mid <x right = mid-1
0 x/4 mid = 0+ x/4 mid * mid <x right = mid-1
*/
int fangfa_2(int x)
{
int index =-1, left =0 ,right=x;
while(left<=right)
{
int mid =left+ (right -left)/2;
if(mid *mid <=x)
{
index=mid;
left=mid+1;
}
else
{
right=mid-1;
}
}
return index;
}
//3.牛顿迭代算法
/*
算法思想: 利用关系式 n= x/n ;
最靠近的数是 (n+x/n)/2 他的数值会逐渐接近我们要求的值
利用递归 的思想
比如说 24
1 * 24 / res = 25/2 =12 ---> 递归 (n+ x/n)
2 * 12 / res =14/2=7
3 * 7 /res =10/2 =5
4 * 5 / res =9/2 =4 ==> 输出
比如说 12
1* 12 /res = 13/2 =6 --->递归
2 *6 /res = 8/2 =4 ==> 输出
*/
double sqtt(double i , int x)
{
double res = (i + x/i)/2;
if(res == i)
{
return i;
}
else
{
return sqtt(res,x);
}
}
int fangfa_3(int x)
{
if(x==0)
{
return 0;
}
double a = (double)x;
return (int)sqtt(a,x);
}
int main()
{
printf("sqrt1(24)= %d\n",fangfa_1(24));
printf("sqrt2(24)= %d\n",fangfa_2(24));
printf("sqrt3(24)= %d\n",fangfa_3(24));
return 0;
}