描述求兩個大的正整數相除的商。
輸入第1行是被除數,第2行是除數。每個數均不超過100位。
輸出一行,相應的商的整數部分
樣例輸入
2376
24樣例輸出
99題意描述:
計算位數不超過200的兩個大整數的商
解題思路:
總體用減法來模擬除法,當然為了讓模擬更高效採用一定的方法。
先將被除數和除數分別存進一維字元陣列str1和str2
如果被除數的長度小於除數的,直接輸出0
逆置str1和str2存進陣列a和b
呼叫jiandeshang()函式先試減一次,如果返回值小於零,輸出零表示長度大於等於情況下 不夠減;等於零則 正好夠減,意即剛好減數和被減數相等
如果返回值大於零,結果陣列的首位元素加一,表示商值加一
將n賦值為被除數和除數相差的數量級個數
如果減過一次除數的被除數的新長度與除數長度差小於零則輸出1,表示只夠減一次,則商為1
如果長度差n大於0則將除數末尾依次補零直到等於l1的長度
進入迴圈,模擬減法,減得每個數量級的個數存入相應的位權
程式**:
1 #include2const
int n=230;3
char
str1[n],str2[n];
4int
a[n],b[n],result[n];
5 #include
6int jiandeshang(int *p1,int *p2,int l1,int
l2);
7void output(int *s);
8int
main()922
23 memset(a,0,sizeof
(a));
24 memset(b,0,sizeof
(b));
25for(j=0,i=l1-1;i>=0;i--)
26 a[j++]=str1[i]-'0'
;27for(j=0,i=l2-1;i>=0;i--)
28 b[j++]=str2[i]-'0'
;2930 l1=jiandeshang(a,b,l1,l2);
31if(l1<=0)32
37else41}
42 memset(result,0,sizeof
(result));
43 result[0]++;
4445 n=l1-l2;
46if(n<0
) 50
else
if(n>0
) 57
}58 l2=l1;
59for(j=0;j<=n;j++)
6065
}66 output(result);//
輸出結果時記得處理進製 67}
68return0;
69}70int jiandeshang(int *p1,int *p2,int l1,int
l2)7185}
86}87for(i=0;i)
93}
94for(i=l1-1;i>=0;i--)
95if
(p1[i])
96return i+1;//
返回長度加1
97return0;
98}99100
void output(int *s)
101109
for(i=n;i>=0;i--)
110if(s[i] != 0
)111
break
;112
113for(j=i;j>=1;j--)
114 printf("%d"
,s[j]);
115 printf("
%d\n
",s[0
]);116 }
易錯分析:
1、注意結果陣列的陣列下標
2、各種特殊情況的考慮
2737 大整數除法
大整數除法 描述求兩個大的正整數相除的商。輸入第1行是被除數,第2行是除數。每個數均不超過100位。輸出一行,相應的商的整數部分 樣例輸入 2376 24樣例輸出 99題意描述 計算位數不超過100位的兩個數的商 整數部分 解題思路 用減法從被除數上一次一次減去除數得到商 程式 include co...
百練2737 大整數除法
計算兩個大整數相除的商。首先將字串逆序轉換成對應的整型陣列,然後基本思想是做減法,從被除數裡減去多少個除數,商就是多少。為了減的更快一些,可以先減去除數的10的ntimes倍數。如7564 23,先減去23的100倍,發現可以減3次,餘下646,於是商增加300。然後用646減去230,發現可以減2...
大整數除法
define maxint 1000 define max 200 int num1 max 10 int num2 max 10 unsigned int total max 10 int sub int a,int b int i 0 for a b i return i cstring big...