精度的实现是需要用字符形数组和整形数组的配合来实现,下面的例子,是一道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个不同的数中找出最大数的算法,并画出流程图.等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)