1. 程式人生 > >C語言實現大數的減法

C語言實現大數的減法

關於大數減法其核心就是:減法的演算法也是從低位開始減,先要判斷減數和被減數那一個位數長,減數位數長是正常減;被減數位數長,則被減數減減數,最後還要加上負號;
兩個位數長度相等時,最好比較哪一個數大,否則負號會處理的很繁瑣;處理每一項時,要先按對應的位用被減數減去減數,用陣列存入,如果差小0,需要向上一位借位,再
把這一位的差加10,以此類推
#include<stdio.h>  
    #include<string.h>  
    #define M 100005 
    using namespace std;  
    char s1[M],s2[M],s[M];  
    int  a[M],b[M],c[M];  
    /*較大數減去較小數,即正常減*/  
    void ss(char s1[],char s2[],int n,int m)  
    {  
        int i,j,a[M],b[M];  
        for(i=0; i<n; i++)  
            a[i]=s1[n-i-1]-'0';  
        for(i=0; i<m; i++)  
            b[i]=s2[m-i-1]-'0';  
        for(i=0; i<n; i++)  
            c[i]=a[i]-b[i];  
        for(i=0;i<n;i++)  
          if(c[i]<0)  
            {  
                while(c[i]<0)  
                {  
                  c[i+1]=c[i+1]-1;//借位(高位減一,低位加十)  
                  c[i]+=10;  
                }  
            }  
    }  
    int main()  
    {  
        int n,m,i,j,k,kk;  
        memset(s1,0,sizeof(s1));  
        memset(s2,0,sizeof(s2));  
        while(~scanf("%s%s",s1,s2))  
        {  
            n=strlen(s1);  
            m=strlen(s2);  
            printf("s1=%d s2=%d\n",n,m);  
            if(n>m)  
                ss(s1,s2,n,m);  
            else if(n<m)  
            {  
                printf("-");  
                ss(s2,s1,m,n);  
            }  
            else  
            {  /*當兩個數位數相同時,判斷兩個數的大小 */  
                k=strcmp(s1,s2);  
    /*strcmp()函式:從第一位開始比較兩個字串大小(不管位數多少)  
    k>0則s1較大,k<0則s2較大,k=0則s1=s2*/    
                if(k==0)  
                {  
                    printf("0\n");  
                    continue;  
                }  
                else if(k>0)  
                    ss(s1,s2,n,m);  
                else  
                {  
                    printf("-");  
                    ss(s2,s1,m,n);  
                }  
            }  
            if(n>m) kk=n;  
            else kk=m;  
            while(c[kk]==0) kk--;//排除前導0  
            for(i=kk; i>=0; i--)  
                printf("%d",c[i]);  
            printf("\n");  
        }  
        return 0;  
    }  

相關推薦

C語言實現大數減法

關於大數減法其核心就是:減法的演算法也是從低位開始減,先要判斷減數和被減數那一個位數長,減數位數長是正常減;被減數位數長,則被減數減減數,最後還要加上負號; 兩個位數長度相等時,最好比較哪一個數大,否則負號會處理的很繁瑣;處理每一項時,要先按對應的位用被減數減去減數,用陣列

C語言實現大數相加(思路+程式碼+執行結果)

大數相加 思路: 1.先將字串倒序並轉換為數字 2.逐位相加,並存入一個數組e[i]中 3.將得到的結果進行進位處理 4.轉換並把陣列e[i]反轉,迴圈輸出結果 #include<iostrea

51nod1005大數加法(C語言實現大數

大數相加 基本思路是: 1、兩個字串把大數讀進來  然後把每一位字元換成數字存到 x y 數組裡面 2、拿 x  y 陣列從後往前 對應位相加  (注意進位) 相加的結果依次存到 c數組裡 3、然後對c陣列處理 如果最高位小於0  那麼結果肯定是負數  就列印一個負

利用C語言實現大數加減法

大數加法: #include <stdio.h> #include <string.h> #define M 100 //定義了數量M是100作為陣列初始化的數量 in

大整數的四則運算(C語言實現)(2)——大整數的加法和減法運算

斷斷續續調了好久個演算法的程式碼終於除錯好了,廢話不多說了,直接說思路,然後上程式碼。上一篇文章介紹了大整數的輸入的處理,包括接收方式、儲存方式、前導零的處理等內容。本文接著上一篇的內容。簡述大整數加減運算的思路。首先對於加法運算,存在以下四種情況:             

使用C++類實現大數加法,大數減法大數乘法

這寫的就是垃圾,多數還是抄的,沒有意思,為了應付作業啥的可以拿去試試,好多東西都算不對。希望後面看到的能自己寫,不然以後還要像我一樣,重新寫一遍。 效果截圖: #include <iostream> #include <string&g

C語言實現只用加法和減法實現兩個正整數的乘除運算

1、乘法a*b如下 #include<stdlib.h> #include<stdio.h> int main() { int a,b; int i,result=0; scanf("%d%d",a,b); for(

c語言實現菲波那切數列對大數求餘

如果百度搜索的話,解決這個問題的程式碼大部分使用C++或者java來寫的,用C寫的很少,因此今天小編獻上用C解決這個問題的程式碼。原題是這樣的 這是藍橋杯的一道練習題,如上題所述,輸入為給定的一個任意正數n,求其對應的菲波那切數列項對10007的餘數,看到題的同學可能二話

二十四進制編碼串轉換為32位無符號整數(C語言實現

bool while open 參數錯誤 hint div 第一個字符 bsp opened typedef int BOOL; #define TRUE 1; #define FALSE 0; #define UINT_MAX 0xffffffff

遺傳算法的C語言實現(二)

print 比較 詳細 author 當前 cross max r+ 訪問 上一次我們使用遺傳算法求解了一個較為復雜的多元非線性函數的極值問題,也基本了解了遺傳算法的實現基本步驟。這一次,我再以經典的TSP問題為例,更加深入地說明遺傳算法中選擇、交叉、變異等核心步

C語言實現粒子群算法(PSO)二

計算 default img 第一個元素 1.4 best 實驗 atl 說過 上一回說了基本粒子群算法的實現,並且給出了C語言代碼。這一篇主要講解影響粒子群算法的一個重要參數---w。我們已經說過粒子群算法的核心的兩個公式為: Vid(k+1)=w*Vid(k)+c1*r

遺傳算法的C語言實現(一):以非線性函數求極值為例

選中 algorithm 利用 mail 進化 lock gcc 最大值 -s 以前搞數學建模的時候,研究過(其實也不算是研究,只是大概了解)一些人工智能算法,比如前面已經說過的粒子群算法(PSO),還有著名的遺傳算法(GA),模擬退火算法(SA),蟻群算法(A

C語言實現粒子群算法(PSO)一

mat 遺傳 基於 [1] 沒有 實驗 規模 直觀 解決 最近在溫習C語言,看的書是《C primer Plus》,忽然想起來以前在參加數學建模的時候,用過的一些智能算法,比如遺傳算法、粒子群算法、蟻群算法等等。當時是使用MATLAB來實現的,而且有些MATLAB自帶了工具

(續)順序表之單循環鏈表(C語言實現)

include 作者 指針 順序 gb2 mark oos case 循環 單循環鏈表和單鏈表的唯一差別在於單循環鏈表的最後一個節點的指針域指向第一個節點, 使得整個鏈表形成一個環. C實現代碼例如以下: #include<stdio.h>

geek青年的狀態機,查表,純C語言實現

fill south 總結 target 堅持 str 分享 接收 backward geek青年的狀態機,查表,純C語言實現 1. 問題的提出。抽象 建一,不止是他,不少人跟我討論過這種問題:怎樣才幹保證在需求變更、擴充的情況下。程序的主體部分不動呢? 這是一個

C語言實現數據結構串(堆分配存儲表示法)

+= 賦值 size ++ fine hello n) clu 刪除字符串 ———————————————————————————————————————————— 堆分配存儲表示法 —————————————————————————————————————————

帶頭節點的單鏈表-------C語言實現

lib gmail spa 階段 c語言實現 fun 變化 尾插 mail 1 /***************************************************** 2 Author:Simon_Kly Version:0.1

排序(3)---------冒泡排序(C語言實現)

std 強調 tracking i++ oid printf pre rand() 執行 說到冒泡排序,大一的時候第一次學習這個排序算法,可能大家不知道,“冒泡”在我說的方言裏面是吹牛逼的意思。所以就認為這個排序算法特吹牛逼有木有。 相信大家對全部的排

數據結構之---C語言實現廣義表頭尾鏈表存儲表示

tle substring [1] 原子 depth ring else if max sig //廣義表的頭尾鏈表存儲表示 //楊鑫 #include <stdio.h> #include <malloc.h> #include <std

C語言實現中綴表達式轉後綴表達式

ctype 結束 錯誤 ini c語言實現 base color src 格式 代碼如下: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define STACK