正文
c语言求精度函数 c语言计算精度控制
小程序:扫一扫查出行
【扫一扫了解最新限行尾号】
复制小程序
【扫一扫了解最新限行尾号】
复制小程序
c语言求高精度n!用数组求怎么做
涉及到大整数的问题
建议使用java的BigInteger类
用C需要编写一个函数,使用数组来储存每个位的值
这里我用C++写了一个类,你自己先看看
------------------------------------------------
//BigCount.h头文件
#includestdio.h
#include iostream.h
#includemath.h
#includestring.h
#includestdlib.h
#define MAX 1000
class BigCount{
private:
int math1[MAX],math2[MAX],mathOK[MAX];
int w1,w2;
//w1是整数1的位数 w2是整数2的位数
//char str1[MAX],str2[MAX];
public:
BigCount()
{
int i=0;
for(;iMAX;i++)
{
math1[i]=0;
math2[i]=0;
mathOK[i]=0;
}
w1=w2=0;
}
int Diversion(char *str1,char *str2)
{
int p=0,k=0;
p=strlen(str1)-1;
w1=p+1;
while(p=0) //转换第一个大整数
{
if(*(str1+p)'9' || *(str1+p)'0') {cout"输入的数字不合法,失败!"endl;exit(0);}
math1[k]=*(str1+p)-'0';
k++;
p--;
}
k=0;p=0;
p=strlen(str2)-1;
w2=p+1;
while(p=0)
{
if(*(str2+p)'9' || *(str2+p)'0') {cout"输入的数字不合法,失败!"endl;exit(0);}
math2[k]=*(str2+p)-'0';
k++;
p--;
}
if(w1w2) k=w1-1;
if(w1=w2) k=w2-1;
return(k); //返回值是两个整数中位数最多的那个数的位数
}
char *Add(char s1[],char s2[]) //两个整数相加的方法
{
int k=0,p=0;
int jw=0;
int w1,w2; //每个字符串的长度
char r[MAX]={'\0'},*str=r;
char str1[MAX]={'\0'},str2[MAX]={'\0'};
int math1[MAX]={0},math2[MAX]={0};
strcpy(str1,s1); //复制字符串
strcpy(str2,s2);
w1=strlen(str1);//计算长度
w2=strlen(str2);
if(w1w2) k=w1-1; //得到两个整数的最长长度
else k=w2-1;
Diversion(str1,str2,math1,math2); //转换着两个字符串为相应的单数字数组
p=0;
while(p=k)//依次加上每一位(在数组中)
{
mathOK[p]=math1[p]+math2[p]+jw;
if(mathOK[p]9) {jw=1;mathOK[p]=mathOK[p]%10;}
else jw=0;
p++;
}
if(jw==1) {mathOK[p]=1;k=k+1;} //最后(最大)一位超过10,则添加一位并进位
for(p=k;p=0;p--) //输出答案并返回这个字符串
{
r[k-p]=mathOK[p]+'0';
}
return(str);
}
void Diversion(char *str1,char *str2,int *m1,int *m2)
//对两个字符串,分别转换成单个数字的数组,保存到m1 m2
{
int k=0,p=0;
p=strlen(str1)-1;
while(p=0) //转换第一个大整数
{
if(*(str1+p)'9' || *(str1+p)'0') {cout"输入的数字不合法,失败!"endl;exit(0);}
m1[k]=*(str1+p)-'0';
k++;
p--;
}
k=0;p=0;
p=strlen(str2)-1;
while(p=0)
{
if(*(str2+p)'9' || *(str2+p)'0') {cout"输入的数字不合法,失败!"endl;exit(0);}
m2[k]=*(str2+p)-'0';
k++;
p--;
}
}
int Add(int *m1,int *m2,int n1,int n2)//单个整数的相加方法
{
int i,tmp,ws,k=0,jw=0;
int math[MAX]={0},*p=math;
int math1[MAX]={0},math2[MAX]={0};
memcpy(math1,m1,sizeof(int)*n1);
memcpy(math2,m2,sizeof(int)*n2);
for(i=0;in1/2;i++)
{
tmp=math1[i];
math1[i]=math1[n1-i-1];
math1[n1-i-1]=tmp;
}
for(i=0;in2/2;i++)
{
tmp=math2[i];
math2[i]=math2[n2-i-1];
math2[n2-i-1]=tmp;
}
if(n1n2) ws=n1;
else ws=n2;
while(kws)
{
math1[k]=math1[k]+math2[k]+jw;
if(math1[k]9) {math1[k]=math1[k]%10;jw=1;}
else jw=0;
k++;
}
if(jw==1) {math1[k]=1;k++;}
for(i=0;ik/2;i++)
{
tmp=math1[i];
math1[i]=math1[k-i-1];
math1[k-i-1]=tmp;
}
for(i=0;ik;i++)
{
printf("\n-----%d ",math1[i]);
}
printf("--------\n");
return(k);
}
void IntToStr(int x,char *ptr) //long int型转成char型
{
char str[MAX]={'\0'},*p=str,tmp;
int i,n;
i=0;
for(n=x;n!=0;n=n/10) //这样的结果是个位在前
{
if((tmp=n%10+'0')'9' || tmp'0') {cout"整数载入错误"endl;exit(0);}
str[i]=tmp;
i++;
}
n=strlen(str);
for(i=0;in/2;i++)//颠倒位置
{
tmp=str[i];
str[i]=str[n-i-1];
str[n-i-1]=tmp;
}
strcpy(ptr,p);
return;
}
char *ArrayToStr(int m[MAX],int n) //整数的单个数集转换成字符串
{
char str[MAX]={'\0'},*p=str,tmp;
for(int i=0;in;i++)
{
if((tmp=m[i]+'0')'9' || tmp'0') {cout"整数载入错误"endl;exit(0);}
str[i]=tmp;
}
return(p);
}
int StrToArray(char *str,int *math) //返回这个整数的数位长度
{
int p,k;
p=strlen(str)-1; //字符串长度
k=0; //整数位数
printf("字符串是%s\n",str);
while(k=p) //转换大整数
{
if(*str'9' || *str'0') {printf("输入的数字不合法,失败!(%d)\n",*str);exit(0);}
math[k]=*str-'0';
k++;
str++;
}
return(k);
}
char *Mult(char *str1,char *str2)
//任意整数字符串相乘,返回结果字符串
{
int i,j,k,w1,w2;
int den=1; //计算结果的符号问题
char str[MAX]={'\0'},*p=str,*x="0";
char f[MAX]={'\0'},*f1=f; //中间保存变量
char txt[MAX]={'\0'},*text=txt; //结果变量
char *s1=str1,*s2=str2,sss1[MAX]={'\0'},sss2[MAX]={'\0'};
int math1[MAX]={0},math2[MAX]={0};
if(*str1=='-') {den=den*(-1);s1=str1+1;} //判断符号
if(*str2=='-') {den=den*(-1);s2=str2+1;}
Diversion(s1,s2,math1,math2); //把字符串转换成单个数字数组
w1=strlen(s1);
w2=strlen(s2);
for(i=0;iw1;i++)//双层循环来做乘法的算法
{
for(j=0;jw2;j++)
{
k=i+j;
//printf("%d*%d\n",math1[i],math2[j]);测试用
IntToStr(math1[i]*math2[j],p);//把本次计算值转换成字符串
while(k0)//根据相乘的两个数字所在的位数,后面添加相应位个0
{
strcat(p,x);
k--;
}
//printf("本次计算之前f1 %s\n",f1);测试用
text=Add(f1,p); //把这个数与结果相加并保存到text字符串
strcpy(f1,text); //这次的结果拷贝又给f1,以便下次使用Add方法
//printf("本次计算结果%s\n",f1);测试用
}
}
if(strlen(text)==0) text[0]='0';//哈哈,万一计算结果是'\0',我们就给他一个0
else if(den==-1) //如果结果是负号 处理:将所有字符向后移一位,前面加'-'
{
i=strlen(text);
while(i)
{
*(text+i)=*(text+i-1);
i--;
}
*text='-';
}
return(text);//返回
}
};
-----------------------------------
//user.cpp-----main()文件
#include "BigCount.h"
main()
{
int t;
BigCount temp;
char str1[1000],*p1=str1,str2[1000],*p2=str2;
char ok[1000],*asp=ok;
cout"输入一个数字,任意大:"endl;
cint;
temp.IntToStr(1,p1);
for(int i=1;i=t;i++)
{
temp.IntToStr(i,p2);
p1=temp.Mult(p1,p2);
}
printf("%s\n",p1);
}
注意:当输入的数字过大,计算时间会很久 222!使用3秒
c语言求高精度小数
//改了部分代码
#include stdio.h
#include math.h
#define N 200 //小数位数,方便调试
int main(){
int m,n;
int i;
int j=0;
scanf("%d/%d",m,n);
if(m*n0){ //处理一下正负号:如果结果是负数时
printf("-"); //先输出负号
m=abs(m); //后面运算过程全部用正数来运算
n=abs(n);
}
printf("%d.",m/n);
m=m%n;
for(i=1;i=N;i++){
if(m==0){ //能整除时
printf("0");
continue;
}
j=10*m/n;
printf("%d",j);
m=10*m%n;
}
printf("\n");
return 0;
}
C语言近似求pi,输入eps精度,怎么做
#include stdio.h
int main(){
double i,eps,k=1,s=1;
scanf("%le",eps);
for(i=1;k=eps;i++)
{k*=i/(i*2+1);s+=k;}
printf("PI=%.5f",s*2);
return 0;
}
C语言中fabs是什么意思
fabs函数是一个求绝对值的函数c语言求精度函数,求出x的绝对值c语言求精度函数,和数学上的概念相同c语言求精度函数,函数原型是extern
float
fabs(float
x),用法是#include
math.h。
fabs()函数的声明c语言求精度函数:double
fabs(double
x)。其中参数x
是浮点值,这个函数返回x的绝对值。代码示例如下c语言求精度函数:
int
main
(){
int
a,
b;
a
=
1234;
b
=
-344;
printf("The
absolute
value
of
%d
is
%lf",
a,
fabs(a));
printf("The
absolute
value
of
%d
is
%lf",
b,
fabs(b));
return(0);}
编译和运行上面的程序,这将产生以下结果:
The
absolute
value
of
1234
is
1234.000000
The
absolute
value
of
-344
is
344.000000
扩展资料:
fabs()和abs()区别:
(1)参数对象不同
abs()是对整数取绝对值,
而fabs()是对浮点数取绝对值。
(2)函数原型不同:
int
abs(int
x)
double
fabs(double
x)
(3)头文件不同:
abs():
#include
stdlib.h
fabs():
#include
math.h
参考资料:
百度百科-fabs函数
c语言用高精度方法,求s=1+2+3+4+……+n的精确值
#includestdio.h
#includestring.h
void readint(int a[])
{ char s[101];
scanf("%s",s);
a[0]=strlen(s);//读入数字字符串c语言求精度函数,测出并记录位数
for(int i=0; ia[0]; i++) //把字符串逆序保存到数值数组
a[a[0]-i]=s[i]-'0';
}
void prt(int a[])
{ for(int i=a[0]; i0; i--)printf("%d",a[i]);
printf("\n");
}
void mul(int a[],int b[],int c[])
{ int i,j;
for(i=1; i=a[0]; i++)
for(j=1; j=b[0]; j++)
c[i+j-1]+=a[i]*b[j];
c[0]=a[0]+b[0];
for(i=1; i=c[0]; i++)
{ c[i+1]+=c[i]/10;
c[i]%=10;
};
if(c[c[0]]==0)c[0]--;
}
void add1(int a[])
{ int i=1;
a[1]++;
while(a[i]9)a[i]-=10,a[i+1]++,i++;
if(ia[0])a[0]=i;
}
int main()
{ int a[101]= {0},b[101]= {0},c[202]= {0};
readint(a);
b[0]=a[0]-(a[a[0]]==1);
for(int i=a[0]; i0; i--)b[i]=a[i]/2+5*(a[i+1]%2);
if(a[1]%2)add1(b);else add1(a);
mul(a,b,c);
prt(c);
return 0;
}
c语言求sin函数近似值精度问题!
你这个程序的设计思路有问题
x-x^3/3!+x^5/5!.......
是这个公式吧
s=x;
t=1.0;
int flag=1;
for(i=1;tu;i+=2)
{
flag*=-1; //这个是正负号变化常用的方式
c*=x*x; //分子
t/=i*(i+1); //是分母
s+=flag*c*t;
}
这样特别是分母的处理方式,就不需要long型的变量了
c语言求精度函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于c语言计算精度控制、c语言求精度函数的信息别忘了在本站进行查找喔。