【問題描述】
編寫程式實現兩個超長正整數(每個最長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...