2737 大整數除法

2022-06-20 18:09:17 字數 2074 閱讀 2055

描述求兩個大的正整數相除的商。

輸入第1行是被除數,第2行是除數。每個數均不超過100位。

輸出一行,相應的商的整數部分

樣例輸入

2376

24樣例輸出

99題意描述:

計算位數不超過200的兩個大整數的商

解題思路:

總體用減法來模擬除法,當然為了讓模擬更高效採用一定的方法。

先將被除數和除數分別存進一維字元陣列str1和str2

如果被除數的長度小於除數的,直接輸出0

逆置str1和str2存進陣列a和b

呼叫jiandeshang()函式先試減一次,如果返回值小於零,輸出零表示長度大於等於情況下 不夠減;等於零則 正好夠減,意即剛好減數和被減數相等

如果返回值大於零,結果陣列的首位元素加一,表示商值加一

將n賦值為被除數和除數相差的數量級個數

如果減過一次除數的被除數的新長度與除數長度差小於零則輸出1,表示只夠減一次,則商為1

如果長度差n大於0則將除數末尾依次補零直到等於l1的長度

進入迴圈,模擬減法,減得每個數量級的個數存入相應的位權

程式**:

1 #include2

const

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...