當前位置:首頁 » 編程語言 » 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 06:22:04 瀏覽:525
字體目錄在哪個文件夾 發布:2024-11-15 06:20:28 瀏覽:181
php種子怎麼打開 發布:2024-11-15 06:07:01 瀏覽:346
密碼箱的密碼忘記了如何開鎖 發布:2024-11-15 06:04:41 瀏覽:956
安卓軟體和蘋果系統哪個好 發布:2024-11-15 05:48:32 瀏覽:284
pythonwhileelse 發布:2024-11-15 05:39:10 瀏覽:672
java文件流上傳文件 發布:2024-11-15 05:24:02 瀏覽:148
linux安裝so 發布:2024-11-15 05:22:29 瀏覽:582
九游版冒險王2適合安卓哪個版本 發布:2024-11-15 05:12:33 瀏覽:601
iphonexsmax怎麼連接伺服器 發布:2024-11-15 05:11:46 瀏覽:776