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
重写一遍:“+”、“-”、“*”。函数吧
方法二:(还在想想想实现。。。)
这篇文章有点意思:手算开方 (就是百度问答了,懒人专属)

浙公网安备 33010602011771号