关闭

大数开方

877人阅读 评论(0) 收藏 举报
分类:

大数开方:代入法

1、把被开方数的整数部分从个位起向左每隔n位为一节,用撇号分开;

2、根据左边第一节里的数,求得开n次算术根的最高位上的数,假设这个数为a;

3、从第一节的数减去求得的最高位上数的n次方,在它们的差的右边写上第二节数作为第一个余数;

4、用第一个余数除以n(10a)^(n-1),所求的整数部分试商(如果这个最大整数大于或等于10,就用9做试商);

5、设试商为b。如果(10a+b)^n-(10a)^n小于或等于余数,这个试商就是n次算术根的第二位;如果(10a+b)^n-(10a)^n大于余数,就把试商逐次减1再试,直到(10a+b)^n-(10a)^n小于或等于余数为止。

6、用同样的方法,继续求n次算术根的其他各位上的数(如果已经算了k位数数字,则a要取为全部k位数字)。

 

大数开方算法思路:

步骤:

1、将被开方数从右向左每两位分成一组;

2、从左边第一组开始运算,把第一组数作为余数,执行3;

3、设置一个基数r=0;

4、用r乘以20加上试商的和再乘以试商,所得的结果与余数比较,如果所得结果比余数小,并且试商再增大1,所得结果大于余数,则该试商为所求平方根的第一个数字。

5、把r的值乘以10再加上试商的值,作为新的一轮的r的基值;

6、用余数减去上述所得结果,再与后面一组数组合,作为新的一组余数;

7、继续执行4;

代码:

#include <iostream>
#include <cstring> 
#include <cstdlib> 
using namespace std;
void sqrt(char *str)
{
	double i,r,n;
	int j,l,num,x[1005];
	if (strlen(str)==1&&str[0]=='0')
	{
		cout<<0<<endl;
		return;
	}
	if (strlen(str)%2==1)
	{
		n=str[0]-48;
		l=-1;
	}
	else
	{
		n=(str[0]-48)*10+str[1]-48;
		l=0;
	}
	r=0,num=0;
	while (true)
	{
		i=0;
		while (i*(i+20*r)<=n)
			i++;
		i--;
		n-=i*(i+20*r);
		r=r*10+i;
		x[num]=(int)i;
		num++;
		l+=2;
		if (l>=strlen(str))
			break;
		n=n*100+(double)(str[l]-48)*10+(double)(str[l+1]-48);
	}
	for (j=0; j<num; j++)
		cout<<x[j];
	cout<<endl;	
}
int main()
{
	char ch[1005];
	while (cin>>ch)
		sqrt(ch);
	return 0;
}





0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

整数平方根:整数开方及大整数开方解决方法

输入一个正整数N(1≤N≤ 10^100 ),试用二分法计算它的平方根的整数部分。
  • txl16211
  • txl16211
  • 2014-11-03 16:47
  • 3199

noip2011初赛-大整数开方

noip2011C_4_2(大整数开方)输入一个正整数n(1 const SIZE=200; type hugeint=record len:integer; num:array[1..S...
  • sjtu081200
  • sjtu081200
  • 2015-08-23 17:27
  • 1040

java 大数据方向面试题

第一,谈谈final, finally, finalize的区别。 final—修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为...
  • qq_24037959
  • qq_24037959
  • 2016-07-07 10:18
  • 4456

POJ2109 高精度(含大数开方)+二分

1 高精度(含大数开方)+二分 一个技巧和三点注意: 技巧:假设k^n=p;(k的n次方),那么p的位数/n得到的是k的位数!例如:n=7,p=4357186184021382204544,p的位数为...
  • a272846945
  • a272846945
  • 2016-07-18 21:36
  • 1221

对大数(BigInteger)进行开方运算

对BigInteger进行开方处理
  • mgl934973491
  • mgl934973491
  • 2017-04-21 19:45
  • 219

大数开方

#define MAX_NUM 2000 //两个大数比较大小 int big(char s1[], char s2[]) { int q = 0; while (s1[q] ==...
  • ao929929fei
  • ao929929fei
  • 2011-02-11 18:58
  • 1838

大数 开方 GMP mpz_sqrt

去掉gmp开方里面的判断,比mpz_sqrt节省一点点时间,mpn 和 root的 都可以类似改 被开方数不再分成相等的2部分,而是前面A部分比后面B部分多一些,开方的a位数就比b的位数多, 保证...
  • ssilspro
  • ssilspro
  • 2012-11-24 21:29
  • 334

牛顿法和拟牛顿法,大数开方

牛顿法和拟牛顿法是是求解最优化问题(函数)的常用方法,具有收敛速度快的特点。 牛顿法 考虑无约束最优化问题:其中xx为目标函数的极小值点 minx∈Rnf(x)\min_{\tiny x \...
  • qq_26911619
  • qq_26911619
  • 2018-01-07 23:36
  • 8

大数模板(加减乘除取模开方)

高精度大数模板
  • AcmHonor
  • AcmHonor
  • 2015-07-15 16:00
  • 1462

nyist 773 开方数(大数问题)

 开方数 时间限制:500 ms  |  内存限制:65535 KB 难度:3 描述现在给你两个数 n 和 p ,让你求出 p 的开 n 次...
  • u014253173
  • u014253173
  • 2014-05-08 17:03
  • 1384
    个人资料
    • 访问:109270次
    • 积分:2717
    • 等级:
    • 排名:第15302名
    • 原创:163篇
    • 转载:6篇
    • 译文:0篇
    • 评论:37条
    最新评论