C語言正負大整數加減法 西電C程式作業1

2021-10-06 23:07:36 字數 3625 閱讀 8218

1、高精度計算

涉及知識點:陣列、流程控制、函式等

要求:用整型陣列表示10進製大整數(超過2^32的整數),陣列的每個元素儲存大整數的一位數字,實現大整數的加減法。

主體思路如下:

由於要求使用陣列儲存,首先使用字元的方式讀取輸入,通過陣列的第一位儲存正負符號。

當輸入的資料存在負數時,我們的想法便是將其轉換為兩個正數的加減。這樣事實上只需要考慮正整數的加法和正整數的減法即可,具體**如下:

#include

#include

#include

#define max(a,b) (a)>(b)?(a):(b)

const

int max =

100;

//最大儲存位數

int mark =1;

//判定字串轉換為陣列是是否產生錯誤

int length =0;

//記錄答案的長度

int*

add(

int* num1 ,

int* num2,

int len1,

int len2)

;int

*decre

(int

* num1 ,

int* num2 ,

int len1 ,

int len2)

;void

swap

(int

* a,

int* b)

;void

change

(int

*num ,

char

* s)

;int

main()

printf

("please intput operator(+ or -): \n");

scanf

("%c"

,&ch)

;getchar()

;if(ch !=

'+'&& ch !=

'-')

printf

("please input num2:\n");

scanf

("%s"

,&s2)

;getchar()

;change

(num2,s2)

; len2 =

strlen

(s2);if

(s2[0]

=='-'

) len2--;if

(mark ==0)

puts

(s1)

;printf

("%c\n"

,ch)

;puts

(s2)

;puts

("answer:");

if(ch ==

'+')

}else

}return0;

}void

swap

(int

* a,

int* b)

//比較兩個正整數的大小

intcmp

(int

* num1,

int* num2,

int len1 ,

int len2)

else

if(len2 > len1)

else

}return0;

//相等

}int

*add

(int

* num1 ,

int* num2,

int len1,

int len2)

else

}//負數相加時先將首位符號變為正,並使用flag標記

int flag =0;

if(num1[0]

<0)

int maxlen =

max(len1 , len2)

;int

* ans =

(int*)

malloc

(sizeof

(int)*

(maxlen+1)

);for(

int i =

0; i <= maxlen ; i ++

)int i = len1-1;

int j = len2-1;

int k =0;

int las =0;

//模擬十進位制加法並將結果倒序儲存

while

(i >=

0|| j >=

0|| las !=0)

i =0;

j = k-1;

length = k;

//反轉陣列

while

(i < j)

if(flag ==1)

ans[0]

=-ans[0]

;return ans;

}//num1 - num2

int*

decre

(int

* num1 ,

int* num2 ,

int len1 ,

int len2)

else

if(num1[0]

==0)else

if(num2[0]

==0)//符號相同的情況

if(num2[0]

<0)

//到這裡就只需考慮 正數 - 正數了if(

cmp(num1,num2,len1,len2)

<0)

elseif(

cmp(num1,num2,len1,len2)==0

);}int maxlen =

max(len1 , len2)

;int

* res =

(int*)

malloc

(sizeof

(maxlen));

for(

int i =

0; i < maxlen; i ++

)int i = len1-1;

int j = len2-1;

int k =0;

int las =0;

//模擬減法倒序記錄

while

(j >=

0|| i >=

0|| las !=0)

i =0;

j = k-1;

//反轉陣列

while

(i//除去前端多餘的0操作

int index =0;

while

(res[index]==0

)int t = index;

for(

int i =

0; index < k; i ++

, index++

) k -

= t;

length = k;

return res;

}void

change

(int

*num ,

char

* s)

while

(i < len)

num[t++]=

(s[i++]-

'0');}

}

C語言之小明的加減法

1.題目內容 叛逆期的小明什麼都喜歡反著做,連看數字也是如此 負號除外 比如 小明會把1234它看成4321 把 1234看成 4321 把230看成032 032 32 把 230看成 032 032 32 現在,小明做了一些a b和a b的題目 a,b為整數且不含前導0 如果給你這些題目正確的答...

大數的加減法(C語言版)

大數 首先大數就是超出比 long long int 範圍的數值。那麼超出範圍後應該怎樣計算呢。下面就介紹大數的加減法 對於初學者來說 可能會有點長,但是原理很簡單的。ac include include include char s1 1001 s2 1001 首先定義兩個字元陣列來輸入大數。in...

c語言隨機選擇兩個整數和加減法形成算式要求學生解答

思考題 面向小學1 2年級學生,隨機選擇兩個整數和加減法形成算式要求學生解答。要求 1 只出10道題,每題10分,程式結束時顯示學 生得分 2 確保算式沒有超出1 2年級的水平,只允許進行50以內的加減法,不允許兩數之和或之差超出0 50的範圍,負數更是不允許的 3 每道題學生有三次機會輸入答案,當...