3 4大數減法(包含前導0等問題處理)

2021-09-11 20:34:04 字數 1436 閱讀 3968

【問題描述】

編寫程式實現兩個超長正整數(每個最長80位數字)的減法運算。

【輸入形式】

從鍵盤讀入兩個整數,要考慮輸入高位可能為0的情況(如00083)。

第一行是超長正整數a;

第二行是超長正整數b;

【思路】

1.將把整數倒序儲存,整數的個位存於陣列0下標位置,最高位存於陣列長度-1下標位置。之所以倒序儲存,更加符合我們從左到右訪問陣列的習慣。

2.建立結果陣列,結果陣列的最大長度是較大整數的位數,不需要考慮加一的情況(負-正不考慮)。

3.遍歷兩個陣列,從左到右按照對應下標把元素兩兩相減,夠減直接在當前陣列位置儲存(當前陣列位置的值 += 計算後的值),不夠減按10減,借一位,第乙個數字下一位的值減一。

4.把result陣列的全部元素再次逆序,若有0,去掉首位,0,就是最終結果。

【難點】

判斷兩個數的大小來決定要不要加負號以及到底是a[i]-b[i]還是b[i]-a[i] 要用到去除先導0的知識 具體演算法是找到第乙個不為0的位置然後copy到新陣列裡比較兩個新陣列;

但是 不能簡單地用strcmp解決問題 先判斷長度 相等長度下再strcmp

【**】

#include #include #include #include #include char a[100],b[100];

char a1[100],b1[100];

int c[100]=;

char a[100],b[100];//用來存放倒序陣列

int main()

int len1=strlen(a),len2=strlen(b);

for (i=len1-1;i>=0;i--)

k=0;

for (i=len2-1;i>=0;i--)

int flag;

if(strlen(a1)==strlen(b1))

else if(strlen(a1)>strlen(b1))flag=1;

else flag=-1;

if(flag==1)

int n;

for(n=0;n<100;n++)

}int m;

for(m=99;m>=0&&c[m]==0;m--);

for(i=m;i>=0;i--)

printf("%d",c[i]);

}else if(flag==-1)

int n=0;

for(n=0;n<100;n++)

}int m;

for (m=99;m>=0&&c[m]==0;m--);

for(i=m;i>=0;i--)

printf("%d",c[i]);

}else

printf("0");

return 0 ;

}

前m大的數

total submission s 13762 accepted submission s 4693 problem description 還記得gardon給小希布置的那個作業麼?上次比賽的1005 其實小希已經找回了原來的那張數表,現在她想確認一下她的答案是否正確,但是整個的答案是很龐大的表...

前m大的數

a 前m大的數 sort time limit 1000msmemory limit 32768kb64bit io format i64d i64u submit status description 還記得gardon給小希布置的那個作業麼?上次比賽的1005 其實小希已經找回了原來的那張數表,...

前m大的數

hpu2017 sort 結構體練習 virtual judge 還記得gardon給小希布置的那個作業麼?上次比賽的1005 其實小希已經找回了原來的那張數表,現在她想確認一下她的答案是否正確,但是整個的答案是很龐大的表,小希只想讓你把答案中最大的m個數告訴她就可以了。給定乙個包含n n 3000...