⑴ 關於用c語言編寫高精度加減法
好像是哪個oj上的題目,直接模擬就行了,加減法都是從字元串的最後一個字元算起,如果*a + *b > '9'就進位,同時移動指針 a--, b--,c--就行了。
⑵ 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語言高精度加法
首先,你的進位沒有處理好,就是最後那個循環,其次,你這樣把字元數組轉換成整型數組沒有提高程序的運行效率,反而降低了,滑沖要麼就直接用字元數衡旦組進行操作信攔殲,或者可以每四個字元數字轉換成一個整型數據。(ps,我也不是很厲害,如果有什麼不對,請指正)
⑷ 求高精度的整數加法(C語言)
/*本程序用字元串的形式實現兩個長"整數"進行相加後所得的數,考慮到連續性
輸入,所以用了字元串.
缺點:引用某一位的弊早值為非整數,要將其-48(acsii字元0的值)才得到其整數值
優點:可以連續性輸入兩個數的值
*/
#include "stdio.h"
#include "string.h"
#include "conio.h"
#define MaxSize 100
/*設置數組最大范圍的位數*/
int i; /*定義全局變數i*/
char *add(char *data1,char *data2)
{
char *buff=(char*)malloc(MaxSize+2); /*申請一個存放兩數組相加後的空間*/
int top1,top2,temp_top;
for(i=0;i<MaxSize+2;i++)
buff[i]=0; /*初始化空間,使之都為0*/
top1=strlen(data1);
top2=strlen(data2);
temp_top=top1<top2?top1:top2; /*判斷1數組和2數組的長度,並把小的賦值給temp_top*/
for(i=0;temp_top>0;i++,temp_top--)
{
if(buff[i]+data1[top1-i-1]+data2[top2-i-1]-96>=10) /*判斷個(十,百……)位相加是否要進位*/
{
buff[i]=(buff[i]+data1[top1-i-1]+data2[top2-i-1]-96)%10+48;
buff[i+1]=1;
}
else buff[i]+=data1[top1-i-1]+data2[top2-i-1]-48;
}
if(top1>top2) /*判斷第一個長整數長度是否大於歲備第二個長整數長度*/
{
temp_top=top1-top2;
for(;temp_top>0;temp_top--,i++) /*兩數組相加後,第一個數組還有剩餘的數就依次存在buff指向的空間中,
並且要判斷兩數組最後次相加是否需要進位*/
{
if(buff[i]+data1[temp_top-1]==58)
{
buff[i]='0';
buff[i+1]=1;
}
else buff[i]+=data1[temp_top-1];
}
}
else /*判斷第二個長乎卜毀整數長度是否大於第一個數組的長度*/
{
temp_top=top2-top1;
for(;temp_top>0;temp_top--,i++)
{
if(buff[i]+data2[temp_top-1]==58)
{
buff[i]='0';
buff[i+1]=1;
}
else buff[i]+=data2[temp_top-1];
}
}
if(buff[i]==1) /*如果最高位是進位得來,則加上48換成acsii碼*/
buff[i]='1';
return buff; /*返回buff所指向的空間的指針*/
}
main()
{
char *add_data;
char data_1[MaxSize],data_2[MaxSize];
printf("Please input first long number:");
gets(data_1);
printf("Please input second long number:");
gets(data_2);
add_data=add(data_1,data_2);
printf("%s\n+\n%s\n=",data_1,data_2);
for(;i>=0;i--)
printf("%c",add_data[i]); /*倒序輸出buff里的內容*/
getch();
}
⑸ C語言高精度加法
st3[82]=st2[82];st2[82]=st1[82];st1[82]=st3[82];}
⑹ c語言問題 計算高精度加法
#include<stdio.h>
#include<conio.h>叢裂
#include<string.h>
#define MaxLen 256
void myadd( char* p, int n )
{
int t;
if( (*p) != '\凳鄭飢0' ) t = (*p)-'0';
else t=0;
t = t + n;
if( t>=10 )
{
myadd( p+1, t/10 );
}
*p = t%10 + '0';
}
main()
{
char s[MaxLen] = {0};
char a[MaxLen] = {0};
char b[MaxLen] = {0};
printf( "輸入第一個數字\n" );
scanf( "%s",a );
printf( "輸入第二個數字\n" );
scanf( "%s",b );
int lena = strlen(a);
int lenb = strlen(b);
int len = (lena>=lenb?lenb:lena);
int i;
for( i=0;i<len;i++ )
{
int t = (a[lena-1-i]-'0') + (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
if( lena>lenb )
{
for( ;i<棗返lena;i++ )
{
int t = (a[lena-1-i]-'0');
myadd( &s[i], t );
}
}
else if( lenb>lena )
{
for( ;i<lenb;i++ )
{
int t = (b[lenb-1-i]-'0');
myadd( &s[i], t );
}
}
len = strlen(s);
for( int i1=0;i1<len/2;i1++ )
{
char ch = s[i1];
s[i1] = s[len-1-i1];
s[len-1-i1] = ch;
}
printf( "\n" );
printf( "%s\n",s );
getch();
}
⑺ 求大牛糾錯c語言程序(有關高精度加減法)
/*********************
程序功能:計算任意位兩整數相減
這里我為了程序的可管理性(也就是可維護性)
用了把程序分成了好幾塊,
當然對我來說這並不算多。這樣的程序
更符合軟體工程的要求或說對做比較大的程序較好
雖然這么多還是不夠的,但是怕多了你會覺得太過復雜
請耐心讀完,或直接上機器看結果。
當然對於有小數的也可以寫,但是那樣代碼多得多。
******************/
#define LEN 250
#include <stdio.h>
#include <string.h>
/*A、B異號*/
int subA(char cha[], char chb[], char chc[])
{
int j = 0;
int tem = 0;
int flag = 0;
int a;
int b;
int fa = 0;
int fb = 0;
int lena = strlen(cha) - 1;
int lenb = strlen(chb) - 1;
char ch;
printf("not the same\n");
if ('-' == cha[0])
{
ch = '-';
fb = -1;
}
else
{
fa = -1;
ch = '+';
}
for (; lena > fa && lenb > fb; lena--, lenb--)
{
tem = (cha[lena] - '0') + (chb[lenb] - '0') + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
j++;
}
if (lena > fa)
{
for (; lena >纖旅 fa; lena--, j++)
{
tem = cha[lena] - '0'差豎廳 + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
else if (lenb > fb)
{
for (; lenb > fb; lenb--, j++)
{
tem = chb[lenb] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
if (flag)
{
chc[j] = flag + '0';
j++;
}
chc[j] = ch;
j++;
return j;
}
/*比較函數*/
/****寫這函數是因虛隱為發現用系統比較strcmp()出問題,具體在哪我也沒去查
我當然也知道系統的會返回一些正負或0值,但是我這里測有時候對有時候錯****/
int AcmpB(char cha[], char chb[])
{
int i;
int j;
int lena;
int lenb;
lena = strlen(cha);
lenb = strlen(chb);
if (lena > lenb)
{
return 1;
}
else if (lena < lenb)
{
return -1;
}
else
{
for (i = 0; i < lena; i++)
{
if (cha[i] < chb[i])
{
return -1;
}
else if (cha[i] > chb[i])
{
return 1;
}
}
}
}
/*A、B同號*/
int subB(char cha[], char chb[], char chc[])
{
int i;
int j = 0;
int f;
int tem;
int tema;
int temb;
int lena;
int lenb;
int count = 0;
int temflag;
char ch;
char chtem[LEN];
if ('-' == cha[0])
{
ch = '-';
f = 0;
}
else
{
f = -1;
ch = '+';
}
temflag = AcmpB(cha, chb);
/*調整長度*/
if (temflag < 0)
{
strcpy(chtem, cha);
strcpy(cha, chb);
strcpy(chb, chtem);
/*判斷正負*/
if ('-' == ch)
{
f = 0;
ch = '+';
}
else
{
f = -1;
ch = '-';
}
}
lena = strlen(cha) - 1;
lenb = strlen(chb) - 1;
for (; lenb > f; lenb--, lena--)
{
tema = cha[lena];
temb = chb[lenb];
if (tema < temb)
{
for (i = lena - 1; i > f; i--)
{
if ('0' != cha[i])
{
cha[i] = ((cha[i] - '0') - 1) + '0';
break;
}
else
{
count++;
}
}
if (count)
{
for (i++; i <= lena - 1 && count > 0; i++, count--)
{
cha[i] = '9';
}
}
tema += 10;
}
tem = tema - temb;
chc[j] = tem + '0';
j++;
}
/**退出循環有可能A還有數據**/
for (;lena > f; lena--)
{
chc[j] = cha[lena];
j++;
}
chc[j] = ch;
j++;
chc[j] = '\0';
return j;
}
/*判斷輸入的是否為合法數據,為程序健壯性設計,可不要。
但要保證你輸入的是合法的,這是我規定的,合法返回1否則返回0
注意:這里判斷的標准為正數不帶符號,負數帶減號且正數不能以0打頭
負數也不能寫成如-0123,而是寫成-123否則將造成後面的大改AcmpB比較出錯*/
int isringht(char ch[])
{
int i;
int len = strlen(ch);
/***這個if是防止輸入如-0123類似數據****/
if ('-' == ch[0] && '0' == ch[1])
{
return 0;
}
if ('-' == ch[0] || '0' < ch[0] && ch[0] <= '9')
{
for (i = 1; i < len; i++)
{
if (ch[i] > '9' || ch[i] < '0')
{
return 0;
}
}
if (len == i)
{
return 1;
}
}
else
{
return 0;
}
}
/*輸入函數這里規定如果輸入不合法(含有非數字,除了符號位)
時,重輸入,直到正確,當然還可以設別的出口,如果再加別的可能這程序會過大*/
void input(char ch[])
{
int flag = 1;
while (flag)
{
printf("Input the numbers:\n");
gets(ch);
if (!isringht(ch))
{
printf("Input error !\nplease re_input:\n");
}
else
{
flag = 0;
}
}
}
/*輸出結果*/
void print(char ch[], int n)
{
int i;
int count = 0;
int flag = 1;
/*如果結果為零則直接輸出一個0,而不是輸出一串0*/
for (i = 0; i < n - 1; i++)
{
if ('0' != ch[i])
{
break;
}
}
if (i == n - 1)
{
printf("0");
return;
}
/****修正輸出,比如當有-0003時只輸出-3,正數也類似*****/
for (i = n - 2 - count; i >= 0; i--)
{
if ('0' == ch[i] && 1 == flag)
{
count++;
}
else
{
flag = 0;
break;
}
}
if ('+' == ch[n-1])
{
for (i = n - 2 - count; i >=0; i--)
printf("%c", ch[i]);
}
else
{
for (i = n - 1; i >= 0; i--)
{
printf("%c", ch[i]);
}
}
}
void main()
{
int i;
int len;
char ch;
char cha[LEN];
char chb[LEN];
char chresult[LEN + 1];/*結果可能有進位,如負數減正數*/
for (i = 0; i < LEN; i++) /*初始化存放結果的數組,以保證結果的正確性*/
{
chresult[i] = '0';
}
chresult[i] = '\0';/*字元串結束標志,本這不用多說*/
input(cha);
printf("the first number is: ");
puts(cha);
input(chb);
printf("the second number is: ");
puts(chb);
if ('-' == cha[0] && '-' != chb[0]|| '-' != cha[0] && '-' == chb[0])
{
ch = 'A';/*A、B異號*/
}
else
{
ch = 'B';/*A、B同號*/
}
switch(ch)
{
case 'A':
{
len = subA(cha, chb, chresult);
break;
}
case 'B':
{
len = subB(cha, chb, chresult);
break;
}
/* default:printf("*********"); */
}
printf("(first number sub second number)result is :\n");
print(chresult, len);
/*puts(chresult);
讓程序到此停頓*/
getch();
}/***由於時間有限沒有進行那麼全面的測試,如果發現有什麼漏處請給出指示
這樣的代碼你認為沒有水平我也沒辦法了.等以後有提高再再次改進吧,現在能縮的只能這樣了,不過一定能再縮的,不過那樣會費更多的心思,要想出更好的演算法**/
⑻ C語言計算高精度加法
if(n==1)
有點問題,因為你沒有給n賦初值,所以n的值不確定,也就是說可能為1,那該if語句就失效了。
另外,其實根本就沒必要事先比較s1和s2的長度,模仿遞增向量的合並方法,先計算長度相同的部分,之後計算剩餘部分。
我用c++的string字元串寫了一個,你參考下。
#include<iostream>
#include<string>
using
namespace
std;
void
Reverse(string
&
str);
void
AddInt(string
&
c,
string
a,
string
b);
int
main()
{
string
a,
b,
c;
cin
>>
a
>>
b;
AddInt(c,
a,
b);
cout
<<
a
<<
"
+
";
cout
<<
b
<<
"
=
"
<<
endl;
cout
<<
c
<<
endl;
system("pause");
return
0;
}
void
Reverse(string
&
str)
{
int
left,
right;
left
=
0;
right
=
str.size()-1;
while
(left
<
right)
{
char
ch
=
str[left];
str[left]
=
str[right];
str[right]
=
ch;
left++;
right--;
}
}
void
AddInt(string
&
c,
string
a,
string
b)//模仿遞增向量的合並方法
{
c.resize(0);
Reverse(a);
Reverse(b);
//逆序計算a+b,則從低位開始計算
int
i,
carry;
i
=
carry
=
0;
while
(i
<
a.size()
&&
i
<
b.size())
{
c
+=
(a[i]-'0'
+
b[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(a[i]-'0'
+
b[i]-'0'
+
carry)
/
10;
i++;
}
while
(i
<
a.size())
{
c
+=
(a[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(a[i]-'0'
+
carry)
/
10;
i++;
}
while
(i
<
b.size())
{
c
+=
(b[i]-'0'
+
carry)
%
10
+
'0';
carry
=
(b[i]-'0'
+
carry)
/
10;
i++;
}
while
(carry
>
0)//計算進位部分
{
c
+=
carry
%
10
+
'0';
carry
/=
10;
}
i
=
c.size()
-
1;
while
(c[i]
==
'0')//消除多餘的高位0
{
i--;
}
c
=
c.substr(0,
i+1);
Reverse(c);
}
⑼ 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語言高精度加法
所謂高精度加法一般都是把數字存成字元型,然後按照加法規則一位一位的加並進位。我做過長整數的,基本上位數沒什麼限制。如果帶小數的話需要處理一下,稍微麻煩一些