当前位置:首页 » 编程语言 » c语言高精度

c语言高精度

发布时间: 2022-01-23 12:25:55

c语言编程 高精度加减法

等十分钟
在给你写
加法函数
好久没写程序了
本来以为十分钟能写好
。。。。。(修改:修复了个小bug)
void
plus(char
*a,
char
*b,
char
*c){
int
i,index_a,index_b,index_c,carry=0,ten='9'+1,temp_index_c;
index_a=strlen(a)-1;
//
index变量指向最末一个数字
index_b=strlen(b)-1;
index_c=index_a>index_b?
index_a:index_b;
temp_index_c=index_c;
if(index_a>=index_b){
for(i=index_b+1;i>=0;i--){
b[i+(index_a-index_b)]=b[i];
}
for(i=0;i<index_a-index_b;i++)
b[i]='0';
}
else{
for(i=index_a+1;i>=0;i--){
a[i+(index_b-index_a)]=a[i];
}
for(i=0;i<index_b-index_a;i++)
a[i]='0';
}
while(index_c>=0){
c[index_c]=a[index_c]+b[index_c]+carry-'0';
if(c[index_c]>=ten){
c[index_c]-=ten-'0';
carry=1;
}
else
carry=0;
index_c--;
}
if(carry==1){
for(i=temp_index_c;i>0;i--){
c[i+1]=c[i];
}
c[0]=1;
}
c[temp_index_c+1]=0;
}

Ⅱ 求高精度C语言程序

给,已经编译运行确认了:
#include<iostream>
#include<stdlib.h>
using namespace std;

int getlength(char *ch)
{
int i;
for(i=0;i<1000;i++)
if(ch[i]=='\0')
break;
return i;
}

void plusdata(int *dt,int *pdt,int k,int kk)
{
int i;
for(i=0;i<k;i++)
{
dt[i]=dt[i]+pdt[i];
if(dt[i]>9)
{
dt[i]-=10;
dt[i+1]++;
}
}
if(dt[i]>9)
{
dt[i]-=10;
dt[i+1]++;
}
if(dt[kk]!=0)
i=kk;
else
i=kk-1;
for(;i>=0;i--)
cout<<dt[i];
cout<<endl;
}

void minusdata(int *dt,int *mdt,int k,int kk,int signal)
{
int i;
for(i=0;i<k;i++)
{
dt[i]=dt[i]-mdt[i];
if(dt[i]<0)
{
dt[i]+=10;
dt[i+1]--;
}
}
if(dt[i]<0)
{
dt[i]+=10;
dt[i+1]--;
}
while(dt[kk]==0)
kk--;
if(signal==0)
cout<<'-';
for(i=kk;i>=0;i--)
cout<<dt[i];
cout<<endl;
}

void main()
{
char ch1[1000],ch2[1000],ch0[2],ch;
int data1[1001],data2[1001];
int i,j,k1,k2,flag=0;

for(i=0;i<1001;i++)
{
data1[i]=0;
data2[i]=0;
}

cout<<"You can input the first date"<<endl;
cin>>ch1;
cout<<"You can input the second date"<<endl;
cin>>ch2;
cout<<"What operation you want?( + or - )"<<endl;
cin>>ch;
ch0[1]='\0';

j=0;
while(ch1[j]=='0')
j++;
for(i=0;i<999-j;i++)
ch1[i]=ch1[i+j];
j=0;
while(ch2[j]=='0')
j++;
for(i=0;i<999-j;i++)
ch2[i]=ch2[i+j];

k1=getlength(ch1);
k2=getlength(ch2);

j=k1;
for(i=0;i<k1;i++)
{
j--;
ch0[0]=ch1[j];
data1[i]=atoi(ch0);
if((ch1[i]<'0')||(ch1[i]>'9'))
flag=1;
}
j=k2;
for(i=0;i<k2;i++)
{
j--;
ch0[0]=ch2[j];
data2[i]=atoi(ch0);
if((ch2[i]<'0')||(ch2[i]>'9'))
flag=1;
}

if(flag==0)
{
if(ch=='+')
{
if(k1<k2)
plusdata(data2,data1,k1,k2);
else
plusdata(data1,data2,k2,k1);
}
if(ch=='-')
{
if(k1==k2)
{
while(data1[k1-1]==data2[k1-1])
k1-=1;
if(data1[k1-1]>data2[k1-1])
minusdata(data1,data2,k2,k2,1);
else
minusdata(data2,data1,k2,k2,0);
}
else
{
if(k1>k2)
minusdata(data1,data2,k2,k1,1);
else
minusdata(data2,data1,k1,k2,0);
}
}
}
else
cout<<"You have input a invaluable char!"<<endl;
}

Ⅲ C语言如何实现高精度浮点运算

可以试试新版的VC#, 使用LONG DOUBLE 等等, 我记得是可以用4 BYTE 的数字的.

然后使用 math lib, 就可以进行大数字运算.

Ⅳ c语言高精度计算

不是我写的,,帮你找到的。。
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include"stdlib.h"

voidmain()
{
intn=0,i=0,j=0,k=0,b=0;
chara[3][500]={0};
intn1=0,n2=0;
chars[500]={0};
intn3=0;
intc=0,c1=0;
inttemp=0;
charop;
charstr[1001]={0};
char*result;

scanf("%d",&n);
result=(char*)malloc(501*n);//根据输入的n申请内存空间
*result='';

/*每次循环都要初始化*/
for(;i<n;i++)
{
//gets(str);
for(j=0;j<500;j++)
{
a[0][j]='';a[1][j]='';a[2][j]='';
s[j]='';
str[j]='';
str[1000-j]='';
}
c=0;c1=0;
k=0;
n1=0;n2=0;n3=0;

/*分离输入的字符串*/
scanf("%s",&str);
for(j=0;str[j];j++)
{
if(str[j]!='+'&&str[j]!='-')
a[k][j-n1]=str[j];
else
{
op=str[j];
k=1;
n1=strlen(a[0])+1;
}
}//forj
n1-=2;
n2=strlen(a[1])-1;
n3=n1>n2?n1:n2;

/*计算加法*/
if(op=='+')
{
for(;n1>=0&&n2>=0;n1--,n2--,n3--)
{
temp=a[0][n1]+a[1][n2]-96;
temp+=c;
if(temp>=10)
{
s[n3]=temp%10+48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
}//for
while(n1>=0)
{
temp=a[0][n1]-48;
temp+=c;
if(temp==10)
{
s[n3]=48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
n1--;
n3--;
}//whilen1
while(n2>=0)
{
temp=a[1][n2]-48;
temp+=c;
if(temp==10)
{
s[n3]=48;
c=1;
}
else
{
s[n3]=temp+48;
c=0;
}
n2--;
n3--;
}//whilen2
if(c)
strcat(result,"1");
strcat(result,s);
strcat(result," ");
}//ifop

/*计算减法*/
else
{/*保证减数大于被减数
*如果被减数大于减数,则交换2数,并设置变量
*/
if(strcmp(a[0],a[1])<0)
{
//a[2]=a[0];a[0]=a[1];a[1]=a[2];
for(b=0;b<3;b++)
{
j=(b+2)%3;
for(k=0;k<=n2;k++)
a[j][k]=a[b][k];
}
n2=n1;n1=n3;
c1=1;//正为0,负为1
}

/*计算减法*/
for(;n2>=0;n1--,n2--,n3--)
{
temp=a[0][n1]-a[1][n2];
temp-=c;
if(temp>=0)
{
s[n3]=temp+48;
c=0;
}
else
{
s[n3]=temp+58;
c=1;
}
}//for
while(n1>=0)
{
temp=a[0][n1]-48;
temp-=c;
if(temp>=0)
{
s[n3]=temp+48;
c=0;
}
else
{
s[n3]=temp+58;
c=1;
}
n1--;
n3--;
}

if(c1)
strcat(result,"-");

/*消除减法结果高位的0*/
j=0;
while(s[j]==48)
j++;
strcat(result,s+j);
strcat(result," ");
}//elseop
}//fori
printf("%s",result);
getch()();
}

Ⅳ C语言 高精度减法

本人参赛模板(含注释,含高精度加法减法运算,main函数有具体示例):

#include <iostream>
#include <string>
using namespace std;

#define HPSIZE 1024

//长度 //倒序存储
struct HP
{
int len;
int s[HPSIZE + 1];
};

//////////////////////////////////////
//输入,只能是正整数
//////////////////////////////////////
string base_input(string str)
{
char c;

c = getchar();
while(c != '\n')
{
str.push_back(c);
c = getchar();
}

return str;
}

/////////////////////////////////////////
//将一个字符串转换成大数存入a
// a 目标变量
// str 原始数据
/////////////////////////////////////////
HP change(string str)
{
HP a;
int i;

while(str[0] == '0' && str.size() != 1)
str.erase(0, 1);

a.len = (int)str.size();
for(i = 1; i <= a.len; ++i)
a.s[i] = str[a.len - i] - 48;
for (i = a.len + 1; i <= HPSIZE; ++i)
a.s[i] = 0;
return a;
}

/////////////////////////////////////////
//输出
/////////////////////////////////////////
void HPprint(const HP &y)
{
int i;

for(i = y.len; i >= 1; i--)
printf("%d", y.s[i]);
}

////////////////////////////////////////
//比较两数大小
//返回 a>b -> 返回值大于0
// a<b -> 返回值小于0
// a=b -> 返回0
////////////////////////////////////////
int HPcompare(const HP a, const HP b)
{
int len;

len = (a.len>b.len) ? a.len : b.len;
while(len > 0 && a.s[len] == b.s[len])
len--;

if(len==0) return 0;
else return a.s[len] - b.s[len];
}

/////////////////////////////////////
//高精度加法c=a+b
// a, b 加数
// c 和
/////////////////////////////////////
HP HPplus(const HP a, const HP b)
{
HP c;
int i, len;

for(i = 1; i <= HPSIZE; i++)
c.s[i] = 0;
len = (a.len>b.len) ? a.len : b.len;

for(i=1;i<=len;i++)
{
c.s[i] += a.s[i] + b.s[i];
if(c.s[i] >= 10)
{
c.s[i] -= 10;
c.s[i + 1]++;
}
}
if(c.s[len + 1] > 0)
len++;
c.len = len;
return c;
}

////////////////////////////////////
//高精度减法c=a-b
////////////////////////////////////
HP HPsub(const HP a, const HP b)
{
HP c;
int i, len;

for(i = 1; i <= HPSIZE; i++)
c.s[i] = 0;
len = (a.len>b.len) ? a.len : b.len;

for(i = 1; i <= len; i++)
{
c.s[i] += a.s[i] - b.s[i];
if(c.s[i] < 0) //借位
{
c.s[i] += 10;
c.s[i+1]--; //高位存于数组的后部
}
}
while(len > 1 && c.s[len] == 0)
len--;
c.len = len;
return c;
}
int main(void)
{
string str_a, str_b;
HP a, b;
str_a = "1000000"; //初始要运算的数字
str_b = "1000000";
a = change(str_a); //将一个字符串转换成大数存入a
b = change(str_b);
HPprint(HPsub(a, b)); //进行减法运算
return 0;
}

Ⅵ C语言高精度加法

所谓高精度加法一般都是把数字存成字符型,然后按照加法规则一位一位的加并进位。我做过长整数的,基本上位数没什么限制。如果带小数的话需要处理一下,稍微麻烦一些

Ⅶ c语言输出浮点数最高精度是多少

1.双精度浮点型数据用%lf输出。因为double是8个字节的,float是4个字节的,%f 的格式就是4个字节的,而 %lf 就是8个字节的。 例如:printf("%lf\n",x);
2.short 占用内存空间2个字节,短整型数据用%d输出 例如:printf("%d\n",a);
例:
#include <stdio.h>
int main()
{double x;
short int a;
printf("%lf",x); // 输入double型
printf("%d",a); //输入短整型
return 0;
}

Ⅷ c语言求高精度小数

//改了部分代码
#include<stdio.h>
#include<math.h>
#defineN200//小数位数,方便调试
intmain(){
intm,n;
inti;
intj=0;
scanf("%d/%d",&m,&n);
if(m*n<0){//处理一下正负号:如果结果是负数时
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(" ");
return0;
}

Ⅸ c语言实现大数比较(高精度)

//可以转换成字符串来比较,添加数字转换成字符串就可以了
#include<stdio.h>
#include<string.h>
intmain()
{
chara[1001],b[1001];
gets(a);
gets(b);
inttemm=strcmp(a,b);
if(temm>0)
printf("%s",a);
elseif(temm<0)
printf("%s",b);
else
printf("两个数据相等 ");
return0;
}

Ⅹ C语言中数据的精度是什么意思

c语言中:

float浮点数7位有效数字。
double双精度数16位有效数字。

单精度数的尾数用23位存储,加上默认的小数
点前的1位1,2^(23+1) = 16777216。因为 10^7 < 16777216 <
10^8,所以说单精度浮点数的有效位数是7位。 双精度的尾数用52位存储,2^(52+1) = 9007199254740992,10^16
< 9007199254740992 < 10^17,所以双精度的有效位数是16位

单精度浮点数的实际有效精度为24
位二进制,这相当于 24*log102≈7.2
位10进制的精度,所以平时我们说“单精度浮点数具有7位精度”。(精度的理解:当从1.000...02变化为1.000...12时,变动范围为
2-23,考虑到因为四舍五入而得到的1倍精度提高,所以单精度浮点数可以反映2-24的数值变化,即24位二进制精度)

浮点数7位有效数字。(应该是单精度数)
双精度数16位有效数字。
浮点数取值范围:
负数取值范围为 -3.4028235E+38 到 -1.401298E-45,正数取值范围为 1.401298E-45 到 3.4028235E+38。
双精度数取值范围:
负值取值范围-1.79769313486231570E+308 到 -4.94065645841246544E-324,正值取值范围为 4.94065645841246544E-324 到 1.79769313486231570E+308。

所以精度是测量值与真值的接近程度。包含精密度和准确度两个方面精度的等级是以它的允许误差占表盘刻度值的百分数来划分的,其精度等级数越大允许误差占表盘刻度极限值越大。量程越大,同样精度等级的,它测得压力值的绝对值允许误差越大。
精度
经常使用的的精度为 2.5 、1.5 级,如果是1.0和0.5级的属于高精度,现在有的数字已经达到0.25级。

热点内容
主流可编译语言 发布:2024-11-15 00:42:23 浏览:729
excel缓存清除 发布:2024-11-15 00:39:53 浏览:486
机械键盘可编程 发布:2024-11-15 00:39:09 浏览:912
php判断字符开头 发布:2024-11-15 00:35:33 浏览:507
网易苹果游戏怎么转移到安卓 发布:2024-11-15 00:07:52 浏览:270
win7php环境搭建 发布:2024-11-15 00:06:55 浏览:17
erpjava 发布:2024-11-14 23:52:23 浏览:253
电脑版地平线四怎么连上服务器 发布:2024-11-14 23:46:42 浏览:472
ios怎么变安卓 发布:2024-11-14 23:46:36 浏览:333
win7共享xp打印机拒绝访问 发布:2024-11-14 23:45:29 浏览:750