2021-11-04 C++平方开方(任意开方)乘方乘阶

小数点11位后精度稍逊,不知何故,求平方数感悟构思所得开方法。本算法使得开任意方变得非常简便。

void 平方开方(int n)
{
	int a = 0, f = 0;
	double z = 0, m = 0.1;
	while ((f = a*a) < n)++a;
	if (f == n)cout << a << "\t";
	else
	{
		z = --a; a = 5;
		while (m>1e-14)
		{
			while ((z + a*m)*(z + a*m) < n)++a;
			while ((z + a*m)*(z + a*m) > n)--a;
			z += a*m; a = 5;
			m *= 0.1;
		}
		cout << setprecision(17) << z << "\t";
	}
}



	int p = 1;while(p<=100) 平方开方(p++);

while (m > 1e-17)修改后精度提升注意位数不能超否则运行不出结果

 

以上在WIN7上演算,同样程序在WIN10演算。 

void 平方开方(int n)
{
	int a = 0, f = 0;
	long double z = 0, m = 0.1;
	while ((f = a*a*a) < n)++a;
	if (f == n)cout << a << "\t";
	else
	{
		z = --a; a = 5;
		while (m > 1e-17)
		{
			while ((z + a*m)*(z + a*m)*(z + a*m) < n)++a;
			while ((z + a*m)*(z + a*m)*(z + a*m) > n)--a;
			z += a*m; a = 5;
			m *= 0.1;
		}
		cout << setprecision(34) << z << "\t";
	}
}
long long 乘阶(int 数, int 次)
{ 
	while (--次) 数 *= 数;
	return 数;
}
long long 阶乘(int a)
{
	long long aaa = 1; int aa = 0;
	while (++aa <= a)aaa *= aa;
	return aaa;
}
long double 乘方(long double 数, int 次)
{ 
	long double 幕 = 数;
	while (--次) 幕 *= 数;
	return 幕;
}
void 平方开方(long double n, int c)
{
	int a = 0, f = 0;
	long double z = 0, m = 0.1;
	while ((f = 乘方(++a, c)) < n);
	if (f == n)std::cout << a << "\t";
	else
	{
		z = --a; a = 5;
		while (m>1e-17)
		{
			while ((乘方(z+a*m, c)) < n)++a;
			while ((乘方(z+a*m, c)) > n)--a;
			z += a*m;
			a = 5;
			m *= 0.1;
		}
		std::cout << std::setprecision(34) << z << "\t";
	}
}



	int p = 0;
	while (++p <= 100) 平方开方(p,4);

WIN7计算器有开立方,WIN10怎么没看到?

	while ((f = 乘方(++a, c)) > 0 && f < n);

 验证开方极限是1

	int f = 1;long double kf = 0;
	while (++f<74)
		std::cout << std::setprecision(17) 
        << f << "\t次开方\t=" << (kf = 平方开方(474, f)) 
        << "\t次乘方\t=" << 乘方(kf, f) << std::endl;

	int f = 1;long double kf = 0;
	std::cout << std::setprecision(14) << (kf = 平方开方(7140229933, 2)) << "\t次乘方\t=" << 乘方(kf, 2) << std::endl;
	while (++f<10000)
		std::cout << std::setprecision(9) << f << "\t次开方\t=" << (kf = 平方开方(474, f)) << "\t次乘方\t=" << 乘方(kf, f) << std::endl;
	//long double a = 32134789587114, aa = 0;
	//cout << std::setprecision(17) << 乘方(2, 7) << "乘方*开方"  << 平方开方(a, 13) <<"="<< 平方开方(a, 13) * 乘方(2, 7) << "\t";
	int a = 1; long double aa = 0;
	while (++a <= 100)cout << std::setprecision(17) << (aa=平方开方(INT_MAX, a)) << "\t" << 乘方(aa, a) << "\n";

 

long double 平方开方(long double n, int c)
{
	long int a = 快速近积数(n), f = 0;
	long double z = 0, m = 0.1;
	while ((f = 乘方(++a, c)) > 0 && f < n);
	if (f == n)return (long double)a;//std::cout << a << "\t";
	else
	{
		z = --a; a = 5;
		while (m>1e-17)
		{
			while ((乘方(z + a*m, c)) < n)++a;
			while ((乘方(z + a*m, c)) > n)--a;
			z += a*m;
			a = 5;
			m *= 0.1;
		}
		while ((乘方(z + a*m, c)) < n)++a; z += a*m;
		std::cout << std::setprecision(17) << z << "\t" << 乘方(z, c) << "\n";
		return z;
	}
}

新官上任三把火(诸葛孔明上任火烧博望坡),新生上学三萝卜(还珠格格上学不求甚解只会萝卜,能把萝卜变成锣钹罗帛罗白全靠别人),横批还想不到,哈哈。。。挺有趣的.。
午饭时灵感得横批:指学成才。指望别人指点来学习,指望抄写别人蒙混过关。有感提问的人百相。
因此改写上下联:上联,新生上学三萝卜,下联,新官上任三把火,横批,指学成才。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值