C实现“手算开方”,好好玩玩(找nüè)(2021/07/15)

网上无意间发现的一道算法题,想试试:(截图若侵权请联系我┗( ▔, ▔ )┛,锻炼复习自用,多多包涵)

 

方法一:加后位数试算法(暴力试算出来)

#include <iostream>		//c++-io头文件标准库流文件引用 
#include <stdio.h>		//c-头文件库标准库IO引用 
#include <stdlib.h>
#include <string.h>
#include <cstring> 
#include <math.h>
#include <malloc.h>		//c内存管理库引用 
#include <conio.h>		//getch()函数需用到的头文件 
//system("PAUSE");		使用暂停语句调试c语言 
using namespace std;
//====================================================== 
//声明定义区 
double mathss(const int*,double,int);
//======================================================
//main()函数区 
int main(void){		//void main(){...} 
//------------------------------
	int *a=(int *)malloc(sizeof(int)*10000000);
	printf("输入平方后的数:"); 
	scanf("%d",a);
	double b=0.0;
	int c=13;
	double d=mathss(a,b,c);
	printf("寻找到的结果:%.13lf\n%.13f * %.13f = %.13lf",d,d,d,d*d);
	free(a);
//------------------------------
	return 0;
}
//======================================================= 
//构造函数定义区 :
double mathss(const int *a,double n,int numb){//遍历+递归(避免除法运算) *a判断数,*n遍历数,numb小数点后位数 
	double p;//加后位数定义,即例如:1,0.1,0.01,0.001 
	int l=0;//循环次数定义 
	for(int j=0,i=0;i<10&&j!=numb;i++){	//循环加后位数 遍历
		p=double(1.0/pow(10.0,j));//确认加后位数 	 
		double f=n*n;//计算遍历数的平方
		//判断遍历数与要求数 
		if(f<*a){//小于,加上加后位数 
			n=n+p; 
		}else if(f==*a||j==numb){ //满足条件,输出 
			return n;
		}else{	//试加后超过判断数,还原到试算前的数,重置i,进一步精确加后位数 
			n=(i=0,n-p);
			j++; 
			continue;
		}
		if(i==9&&j==0)i=0;//小数点前试算加时超10次加后位数时,重置i 
		l++;
	}	
	printf("循环次数:%d\n",l);
	return n;
}

 

还是高精度问题,计算高精度还好好好把握把握了:其实高精度这篇文章不错:https://www.cnblogs.com/BlueHeart0621/p/12238176.html

重写一遍:“+”、“-”、“*”。函数吧

方法二:(还在想想想实现。。。)

这篇文章有点意思:手算开方 (就是百度问答了,懒人专属)

 

posted @ 2021-07-15 01:35  LING18  阅读(170)  评论(0)    收藏  举报