程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言入門知識 >> 四則運算之加減法

四則運算之加減法

編輯:C語言入門知識

問題描述

計算機所能完成的一個基本功能就是完成數據的計算,譬如加法、減法等等。但是在任何一種計算機上,計算中能夠使用的數字都是有一定范圍的,超過了范圍,就沒法得到精確的結果。

你現在接受了一個任務,要編寫一個高精度計算器的核心部分。所謂高精度計算器,就是可以計算很大很大的數據的計算器。而你所需要編寫的程序,就是真正完成高精度加法和高精度減法運算的兩個函數,因為程序其它的部分已經由別人編寫好了。

函數的輸入、輸出接口也已經定義完成,譬如 plus() 函數,它有三個參數 a、b 和 c,都是 char * 類型。a 和 b 分別是參加運算的兩個整數,而 c 用來存放運算的結果。所有的數字都是以字符串的形式保存的。

注意,只需提交你自己編寫的兩個函數。

輸入

輸入的每一行是兩個十進制的正整數和一個運算符,每個整數可以由最多 500 個數字組成。運算符可以是加號或者減號。

輸出

對應著輸入的每一行數據,輸出計算的結果,每個結果占一行。

預設代碼

前置代碼

view plainprint?
  1. /*PRESETCODEBEGIN-NEVERTOUCHCODEBELOW*/
  2.  
  3. #include
  4. #include
  5.  
  6. voidplus(char*a,char*b,char*c);
  7. voidminus(char*a,char*b,char*c);
  8.  
  9. intmain()
  10. {
  11. chara[1000];
  12. charb[1000];
  13. charc[1000];
  14. chars[2];
  15.  
  16. while(scanf("%s%s%s\n",a,s,b)==3){
  17. if(s[0]=='+'){
  18. plus(a,b,c);
  19. }elseif(s[0]=='-'){
  20. minus(a,b,c);
  21. }
  22. printf("%s\n",c);
  23. }
  24.  
  25. return0;
  26. }
  27.  
  28. /*PRESETCODEEND-NEVERTOUCHCODEABOVE*/   測試輸入關於“測試輸入”的幫助 期待的輸出關於“期待的輸出”的幫助 時間限制關於“時間限制”的幫助 內存限制關於“內存限制”的幫助 額外進程關於“{$a} 個額外進程”的幫助 測試用例 1 以文本方式顯示
    1. 1+2?
    2. 3-2?
    以文本方式顯示
    1. 3?
    2. 1?
    1秒 64M 0 題解思路

    大致思路:

    我用的思路是,先將a,b兩個字符串倒序轉化為整形數組,然後模擬加減法的豎式計算通過數組之間的“進位”來將最後的結果存入一個整形數組裡面,最後再把這個整形數組轉化為字符型的數組。

    具體實現方式以及需要注意的事項:

    首先預制的函數裡面在輸入中多了“/n”,這個我們在自己編寫的時候可以先將其去掉,要不然讀入的時候會有問題。

    然後就是進行字符串的轉化,需要注意的是需要先把字符串前面的前導0去掉,借用大神的方法while(a[0]=='0')a++;while(b[0]=='0')b++;這樣就可以吧字符串前面的前導0去掉。但是應該注意字符串a=“0000”或b=“00000”的這種情況,這種情況下會導致,把字符串清空,這裡需要判斷一下,如果經過上面的處理之後字符串的長度為0,我們就可以人為的令字符串的長度為1,a[0]=0,b[0]=0.然後進行轉化,轉化的時候一般有兩種方法比較容易想到一是在後面-‘0’,另一種是在後面-48,不過看發帖說‘0’-‘0’=‘\0’(自己理解是因為兩個字符是一樣的,所以減完之後就是空了),所以還是用第二種方法進行倒序的轉換。這裡對於減法需要注意,為了是最後的‘-’比較好處理,所以我們要用大數減去小數,在做轉換的時候,如果a可以再轉化數組的時候將大的數組放進規定的放大數的數組裡,並做好標記;也可以直接轉化,然後在減的時候用表示大數的數組減去表示小數的數組,並做標記)。注意在每次調用函數的時候都要將自己定義的三個整形數組清0.

    然後就是計算了,對於加法,按照豎式計算的順序每一位的兩個數相加,相加的結果存入c[i]裡面,如果c[i]>9,則c[i+1]++;c[i]+=10;這樣循環著計算(循環的長度是兩個數組裡面最長的數組的長度),最後計算完了之後要判斷c[length](length表示兩個數組裡面最長的數組的長度)是否等於1,即判斷最高位是否有進位,如果有那麼length++。對於減法,思路和加法一樣,按照豎式計算的順序每一位的兩個數相減,相減的結果存入c[i]裡面,如果如果c[i]<0,則c[i+1] - -;c[i]+=10;這樣循環著計算(循環的長度是兩個數組裡面最長的數組的長度),最後計算完了之後要判斷數組a的前面(length表示兩個數組裡面最長的數組的長度)是否有等於0的位,即判斷前面的位是否被借走,剩下0,如果是那麼length--,終止的條件是c[length--]!=0(就是所說的退位)。

    最後就是將整形數組c中的數字轉換為字符串,即每個位上的數+48.要注意減法中如果最後的結果是負數的時候要在數組的前面加‘-’,因為最後是‘%s’輸出的,所以可以領cc[0]=’-’.還要注意在轉換完成的時候要在字符數組的最後加上‘\0’,這樣可以防止由於數組沒有初始化而導致輸出亂碼。

     

    實現代碼
    void plus(char *a, char *b, char *c)
    {
    	int lengtha,lengthb,length;
    	int i,j;
    	int aa[505],bb[505],cc[505];
        for(i=0;i<505;i++)
        {
        	aa[i]=0;
        	bb[i]=0;
        	cc[i]=0;
        }
    	while(a[0]=='0')a++;
    	while(b[0]=='0')b++;
    	lengtha=strlen(a);
    	lengthb=strlen(b);
    	
    	if(lengtha==0&&lengthb!=0)
    	{
    		length=lengthb;
    		aa[0]=0;
    	}
    	else if(lengtha!=0&&lengthb==0)
    	{
    		length=lengtha;
    		bb[0]=0;	
    	}
    	else if(lengtha==0&&lengthb==0)
    	{
    		length=1;
    		aa[0]=0;
    		bb[0]=0;
    	}
    	else if(lengtha>lengthb)
    	{
    		length=lengtha;     //找出最長的數 
    	}
    	else
    	{
    		length=lengthb;
    	}
    	for(i=0;i9)                //計算 
    		{
    			cc[i+1]++;
    			cc[i]-=10;
    		}
    	} 
    	if(cc[length]>0)
    	{
    		length++;
    	}
    	for(j=0;jlengtha)
    	{
    		length=lengthb;
    		temp=1;
    	}
    	else
    	{
    		length=lengtha;
    	}
    	
    	if(temp!=0)
    	{
    		for(i=0;i0)
    	{
    		length--;
    	}
    	length++;
    	
    	if(temp==0)
    	{
    		for(i=0;i

     
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved