高精开根用C++怎么办

高精开根用C++怎么办,第1张

1:将所需输入的数据以字符数组的形式输入,建立字符数组,建立相应的整数数组,然后一一映射,以此来实现数据的输入,需要注意的是,当实现字符向数字映射时,应该减去相应的ASCII偏移值,即48。

2:为了模拟我们在纸上手算的进位模拟运算,我们将字符数组反向填入整数数组,上图的后几行代码实现了这个 *** 作。

3:实现进位加法,这是整个代码的核心部分,需要读者细细体会,认真揣摩,往往需要反复思考,容易遗忘

4:反向输出数据。因为我们的加法是将数组反置,然后由左到右想加的,加完后,个数位在左边,所以,需要反向输出

以下是全部代码:

 #include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

int main()

{

char a1[100],b1[100];

int a[100],b[100],c[100];

int a1_len,b1_len,lenc,i,x;

memset(a,0,sizeof(a));

memset(b,0,sizeof(b));

memset(c,0,sizeof(c));

gets(a1);

gets(b1); //输入加数与被加数

a1_len=strlen(a1);

b1_len=strlen(b1);

for (i=0;i<=a1_len-1;i++)

{

a[a1_len-i]=a1[i]-48; //将 *** 作数放入a数组          }

for (i=0;i<=b1_len-1;i++)

{

b[b1_len-i]=b1[i]-48; //将 *** 作数放入b数组           }

lenc =1;

x=0;

while(lenc <=a1_len || lenc <=b1_len)

{

c[lenc]=a[lenc]+b[lenc]+x; //两数相加

x=c[lenc]/10;   //要进的位

c[lenc]=c[lenc]%10;     //进位后的数

lenc++;     //数组下标加1          }

c[lenc]=x;

if (c[lenc]==0)

{

lenc--; //处理最高进位           }

for (i=lenc;i>=1;i--)

{

cout<<c[i]; //输出结果              }

cout<<endl;

return 0;

}  

一、如果待开方数字为a,次数为b, *** 作方法如下:

输入a,找到表示x的y次方的按键按钮并点击,输入b,点击倒数键,按下等号键即可。

二、计算器开根号的方法:

1、在计算器中输入要开根号的数字,点击根号键按钮,即可开根;

2、打开手机计算器,如果显示的是普通的计算器,将手机旋转过来,输入要开根的数字,点击根号键按钮,即可开根;

3、点击电脑左下角按钮,点击所有应用,选择计算器,打开计算器后,若显示的为标准,则点击标准旁边的按钮,点击科学,输入

先把数学问题描述清楚,你里边有 n 吗? 你求谁?

“新生成的数和前后数开根” 这什么意思呀? 和你前边 算式描述的一致吗?

a 1

b 9

c sqrt(19)

d1 d2

sqrt(ca) sqrt(cb)

d3 d4

sqrt(d2a) sqrt(d3b)

d5 d6

sqrt(d4a) sqrt(d5b)

d(2n+1) d(2n+2)

sqrt(d2n a) sqrt(d(2n+1) b)

是不是这样的

========

#include <mathh>

#include <iostreamh>

double A;

double B;

double fun(int n,double arr)

{

double an;

double E;

int i=1;

while(i<=n){

E=(i%2)A;B;

arr[i]=sqrt(arr[i-1]E]);

i++;

}

return arr[n];

}

int man()

{

int n;

cin>>A>>B;

cin>>n;

double D;

D=new double[n+1];

D[0]=sqrt(AB); // C=sqrt(AB)

fun(n,Arr);

int m=0;

do {

cout<<D[m]<<endl;m++;

}while(m<=n);

}

如果 你用的 是 C 编译 器 只需要把

#include <iostreamh> 改成 #include <stdioh>

输入输出 cin>> cout<< 改用 scanf 和printf

============================================

你的问题出在数学描述上,只要能把数学模型描述清楚实现起来很容易。

你补充描述中 d3=sqrt(ad1),d4=sqrt(d1c),d5=sqrt(cd2),d6=aqrt(d2b) 还是没有看出规律 有没有打错?

看是不是这样:

a 1 = d(-2)

b 9 = d(-1)

c sqrt(19) = d0

d1 d2 k=0

sqrt(d0d(-2)) sqrt(d0d(-1))

d3 d4 k=1

sqrt(d1d(-1)) sqrt(d1d0)

d5 d6 k=2

sqrt(d2d0) sqrt(d2d1)

d7 d8 k=3

sqrt(d3d1) sqrt(d3d2)

d(2k+1) d(2k+2) k

sqrt(dk d(k-2)) sqrt(dk d(k-1))

是不是这样的

========================================================

终于搞明白你的意思了

下面的程序通过了测试

运行结果::

please input a , b & n :1 100 3

0 1

3 177828

2 316228

3 562341

1 10

3 177828

2 316228

3 562341

0 100

说明

a--0 b--0 初始端点

c--1 第一次插值点

d--2 第二次插值点

e--3 第三次插值点

f--

#include <iostreamh>

#include <mathh>

class List { //用链表数据结构来实现

public:

float data; //节点的值

int lev; //节点的级别

List next;

List prev;

List(){next=NULL;prev=NULL;lev=0;};

List(float a,int m){data=a;next=NULL;prev=NULL;lev=m;}

void setdata(float a){data=a;};

void insert(List nod); //链表插入节点

void add(List nod); //添加节点

};

void List::add(List nod)

{

List p=this;

while((p->next)!=NULL){

p=p->next;

}

p->next=nod;

nod->prev=p;

}

void List::insert(List nod)

{

List p;

p=next;

next=nod;

nod->prev=this;

List p1=nod;

while((p1->next)!=NULL){

p1=p1->next;

}

p1->next=p;

}

int main()

{

float a,b;

int m,n;

cout<<"please input a , b & n :";

cin>>a>>b>>n;

List list, tmp, p,q;

list= new List(a,0);

tmp = new List(b,0);

list->add(tmp);

m=1;

while(m<=n){ //第 m 次 插值

p=list;

while((p->next)!=NULL){ //连中每两个节点之间插入一个节点

//值为前后两节点积平方根

tmp=new List(sqrt((p->data)(p->next->data)),m);

//申请节点,计算节点值

q=p->next;;

p->insert(tmp); //插入节点

p=q;

}

m++; //下一次

}

p=list;

while(p){

cout<<p->lev<<"\t"<<p->data<<endl;

p=p->next;

}

}

将根号a赋值给变量b的程序代码编写步骤如下:

1、启动DEVc应用程序进入后选择文件——新建源代码选项进行创建文件。

2、输入头文件数学函数和main函数,定义两个double类型的变量,a和b,给a赋值为9。

3、求a的根,输入代码“b等号sqrta”,将a开根赋值给b,并用printf将b输出。

4、编译运行查看结果,编写结束。

#include<stdioh>

#include<mathh>

void main()

{

 double a=25,s;

  s=sqrt(a);

  printf("s=%2lf\n",s);

}

sqrt的原型:double sqrt(double x),输出格式是%lf,你在看看

简单办法,转double, 再开方。

你的编译器要能全面支持64位无符号整型才行。例如支持 强制转化 unsigned _int64 为 double

#include<stdioh>

#include<mathh>

int main(void){

// unsigned _int64 x; // 我的编译器支持 支持unsigned

signed _int64 x;

double y;

printf("input x in hex 0x100:\n");

scanf("%I64x", &x); // 按16进制格式输入。

printf("x=%I64d\n", x); // 按10进制格式输出。

y = (double) x; // 我的编译器支持 signed _int64 转double, 不支持unsigned 转double

printf("y=%lf\n",sqrt(y)); // 开平方

return 0;

}

-----

scanf("%I64d", &x); // 按10进制格式输入。

============

实际上,double 只有 52 bits 精度,unsigned _int64 会有截断误差。

而 mathh 的sqrt 不支持 unsigned _int64。

也许可以自己编一个迭代 程序,假定 unsigned _int64 y 是平方根,用

(x - y y ) 趋进 0 的方法 迭代 出 y -- 好像不难。达到 y 精度 为 1。

下面是设想,尚无时间验证:

#include<stdioh>

#include<limitsh>

#include<mathh>

int main(void){

unsigned _int64 x,y,y1,y2;

signed _int64 xs;

double z;

printf("max signed _int64 is %I64x\n", _I64_MAX);

printf("max unsigned _int64 is %I64x\n", _UI64_MAX);

printf("input x in hex 0x100:\n");

scanf("%I64x", &x);

printf("x=%I64x\n", x);

if (x <= _I64_MAX){

xs = x;

z = (double) xs;

printf("y=%lf\n",sqrt(z));

} else {

for (y=0;y< 0xffffffff;y=y+0xff) {

if (yy <= x) y1=y;

if (y y > x) {y2=y; break;}

}

for (y=y1;y<=y2;y=y++) {

if (yy <= x) y1=y;

if (yy > x) {y2=y; break;}

}

printf("y1=%I64x y2=%I64x\n",y1,y2); // 输出

}

return 0;

}

输入数小于0x7fffffffffffffff 用 double

大于 0x7fffffffffffffff 用 yy -x

输入输出 用 16 进制数。

以上就是关于高精开根用C++怎么办全部的内容,包括:高精开根用C++怎么办、oppo手机计算器如何开多次方根、C语言编程求c=sqrt(a*b),d=sqrt(a*c),d2=sqrt(c*b),即新生成的数和前后数开根,依次类推n次等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9806115.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存