用C语言编写程序实现大整数(精度数十位到几万位)的四则运算(加、减、乘、除)。

用C语言编写程序实现大整数(精度数十位到几万位)的四则运算(加、减、乘、除)。,第1张

精度的实现是需要用字符形数组和整形数组的配合来实现,下面的例子,是一道ACM试题,关于计算高精度的问题,是算a的b次方但如果a是整数的话,后面需要输入 a0空格b回车。可以计算21的5000次方 或者是20的9000次方

#include<stdioh>

#include<mathh>

int qq(int n)

{ int i, sum=1;

for(i=1;i<=n;i++)

sum=10sum;

return(sum);

}

int main()

{

float r;

int n;

while(1)

{

char a[10000];

long int b[10000];

int k,h,m,i,j,z,g,t,q,e;

long int c=0;

if(scanf("%s%d",a,&n)==EOF)break;

for(i=0;a[i];i++)

if(a[i]=='')k=i;

m=i-k-1;

for(i=k;i<k+m;i++)

a[i]=a[i+1];

h=i;

for(i=0;i<h;i++)

b[i]=a[i]-48;

for(i=0;i<h;i++)c=c10+b[i];

for(i=0;i<h/2;i++){ t=b[i];b[i]=b[h-1-i];b[h-1-i]=t;}

for(e=1;e<n;e++)

{

for(i=0;i<h;i++)b[i]=b[i]c;

for(j=0;j<h-1;j++)

if(b[j]>=10){t=b[j];b[j]=t%10;b[j+1]+=t/10; }

if(b[h-1]>=10)

{

t=b[h-1];

q=b[h-1];

z=1;

while(t>=10)

{

t=t/10;

z++;

}

g=z;

while(z>=1)

{

b[h+g-z-1]=q/qq(g-z)%10;

z--;

}

h=h+g-1;

}

}

if(h<mn)

{

printf("");

for(j=mn-1;j>h-1;j--)printf("0");

for(j=0; ;j++)if(b[j]!=0)break;

for(i=h-1;i>=j;i--)

printf("%d",b[i]);

}

if(h==mn)

{ for(j=0; ;j++)if(b[j]!=0)break;

printf("");

for(i=h-1;i>=j;i--)

printf("%d",b[i]);

}

if(h>mn)

{

for(j=0; ;j++)if(b[j]!=0)break;

if(j<mn-1&&b[h-1]==0)

{

printf("");

for(i=mn-1;i>=j;i--)printf("%d",b[i]);

}

if(j<=mn-1&&b[h-1]!=0)

{ for(i=h-1;i>=mn;i--)

printf("%d",b[i]);

printf("");

for(i=mn-1;i>=j;i--)printf("%d",b[i]);

}

if(j>=mn)

{

for(i=h-1;i>=mn;i--)

printf("%d",b[i]);

}

} printf("\n");

}

return 0;

}

大数的计算主要有加、减、乘三种方法。

由于编程语言提供的基本数值数据类型表示的数值范围有限,不能满足较大规模的高精度数值计算,因此需要利用其他方法实现高精度数值的计算,于是产生了大数运算。

大数运算,顾名思义,就是很大的数值的数进行一系列的运算。在数学中,数值的大小是没有上限的,但是在计算机中,由于字长的限制,计算机所能表示的范围是有限的,当我们对比较小的数进行运算时,这样的数值并没有超出计算机的表示范围,所以可以运算。

但是当我们在实际的应用中进行大量的数据处理时,会发现参与运算的数往往超过计算机的基本数据类型的表示范围,在天文学上,如果一个星球距离我们为100万光年,那么我们将其化简为公里,或者是米的时候,我们会发现这是一个很大的数。这样计算机将无法对其进行直接计算。

在某些领域里,甚至可能出现几百万位的数据进行运算,这是我们很难想象的。大数除法,可以类比人类手算,添位比较取商,中间结果与除数相减所得到的差参与下一轮运算,直到结束。这里需要注意添位时,商有时需要补零,而且除法运算需要使用加、减、乘、比较运算。

数据与运算符的关系:

1、自然数据的表示。例如:求一个曲面梯形的面积。

2、人工数据的处理。例如:程序中的数据。

3、自然数据的人工处理。例如:放大一幅图像的一部分。

在数学计算式中,数据与运算符有数据个数,左右作用,算式形式等具体细致的关系。

略 算法步骤如下: (1)输入 , , , , ; (2)将 与 中的大数记作b; (3)将b与 比较大小,大数记作b; (4)将b与 比较大小,大数记作b; (5)将b与 比较大小,大数记作b; (6)输出b.流程图如图: 在上述的3个关键步骤中,每一步都要与上一步中得到的最大数b进行比较,得出新的最大数,将其也记作b.b可以取不同的值.

写的一个C++实现10000的阶乘的代码

#include<iostream>

#define N 10000//设阶乘数为10000

#define SIZE 40000//预留40000位保存结果

using namespace std;

void mul(int n1,int n2)//两数相乘

{

for(int i=0;i!=SIZE;++i)

n1[i]=n2;

for(int i=0;i!=SIZE;++i){

n1[i+1]+=(n1[i]/10);

n1[i]%=10;

}

}

int main()

{

int num=new int[SIZE];

memset(num,0,SIZE);

num[0]=1;

//N的阶乘

for(int i=1;i!=N+1;++i){

mul(num,i);

}

//输出时排除开头的0

for(int i=SIZE-1;i!=-1;--i){

if(0!=num[i]){

for(int j=i;j!=-1;--j){

cout <<num[j];

}

break;

}

}

delete[] num;

return 0;

}

很多地方不合理,尤其是需要预留空间,这就要我先预算一下会有多少位了。运算时间20秒左右,效率也不行,应该在10秒左右比较合理,机器为P3 733,内存256MB。

这个需要动用字符串数组来进行模拟运算,否则不能得到真实的答案,具体如下

#include <iostream>

#include <cstdlib>

#include <ctypeh>

#include <windowsh>

#define N 10000

using namespace std;

void main()

{

char str1[N],str2[N];

int a,b,c,m,n,i,j,k,x;

cout<<"input the number of multiplicand:";

cin>>str1;

cout<<"input the number of multiplies:";

cin>>str2;

m=strlen(str1);

n=strlen(str2);

a=new int[m];

b=new int[n];

c=new int[m+n];

for(i=0;i<m;i++)

{

if(isdigit(str1[m-i-1])) //将被乘数和乘数从字符串数组中提取出来,并且倒叙放入a,b两个数组

a[i]=str1[m-i-1]-48;

}

for(j=0;j<n;j++)

{

if(isdigit(str2[m-j-1]))

b[j]=str2[m-j-1]-48;

}

if(str1[0]=='0'||str2[0]=='0')

cout<<"0"<<endl;

else

{

for(i=0;i<m+n;i++)

c[i]=0;

for ( i=0;i<n;i++)

for(j=0;j<m;j++)

{

k=m+n-1;

c[k-i-j]+=b[i]a[j];

x=c[k-i-j];

while (x>=10) //处理进位

{

c[k-i-j]=x%10;

c[k-i-j-1]+=x/10;

x=c[k-i-j-1];

k--;

}

}

for(i=0;i<m+n;i++)

if(c[i]!=0)

break;

cout<<str1<<endl;

cout<<"X"<<endl;

cout<<str2<<endl;

for(k=i;k<m+n;k++)

cout<<c[k];

cout<<endl;

}

system("pause");

}

以上就是关于用C语言编写程序实现大整数(精度数十位到几万位)的四则运算(加、减、乘、除)。全部的内容,包括:用C语言编写程序实现大整数(精度数十位到几万位)的四则运算(加、减、乘、除)。、01大数的计算、设计从5个不同的数中找出最大数的算法,并画出流程图.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存