# 2020q3 Homework5 (quiz5)
contributed by < `fdfdd12345628` >
## 測驗一
題目要求作浮點除法,程式碼如下
```clike=
#include <stdio.h>
#include <stdlib.h>
double divop(double orig, int slots) {
if (slots == 1 || orig == 0)
return orig;
int od = slots & 1;
double result = divop(orig / D1, od ? (slots + D2) >> 1 : slots >> 1);
if (od)
result += divop(result, slots);
return result;
}
```
可以發現,如果除數是偶數,就直接回傳第八行 `result`
因此可以合理判斷第八行是將除數與被除數都除以二,才會算出原本的答案,因此 `D1` 為 `2`
接著如果除數是奇數,則會再加上第十行的計算,因此可以用數學推算出遞迴的結果
$result={orig \over (slots+D2)}+{orig \over (slots+D2)^2}+{orig \over (slots+D2)^3}...$
由等比級數公式可以知道 $result={{orig \over (slots+D2)}*(1-1 / (slots+D2)^ \infty ) }/{(1-1/(slots+D2))}={orig/(slots+D2) \over 1-1/(slots+D2)}={orig \over slots+D2-1}$ 所以如果在奇數時要使等號成立, `D2` 為 `1`
## 測驗二
題目要求做根號 float ,也就是給定 $n$ 解 $x^2-n=0$ 的 $x$
根據牛頓法
## 測驗三
題目要求為給定一個正整數 N,問 N 能寫成多少種連續正整數之和,例如 9 可寫成 $4+5$ ,或者 $2+3+4$ 。
連續正整數的可以寫成以下格式 $X+(X+1)+(X+2)...$ 也就是 $X*n+(1+2+3+...+(n-1))$
所以如果要判斷一個整數是不是能夠寫成多少種連續正整數之和,只要將它減去 $(1+2+3+...+(n-1))$ 並且判斷剩下的數字能不能被 $n$ 整除即可,
由於 $(1+2+3+...+(n-1))$ 是會隨著 $n$ 而逐漸加上去的,因此可以重複使用之前計算的結果。
題目程式碼如下:
```clike=
int consecutiveNumbersSum(int N)
{
if (N < 1)
return 0;
int ret = 1;
int x = N;
for (int i = 2; i < x; i++) {
x += ZZZ;
if (x % i == 0)
ret++;
}
return ret;
}
```
可以看到 `x` 的值在迴圈中是被重複利用的,所以可以判斷他會被逐漸減去 $1, 2 ...$ ,減去後再判斷能不能被 `i` 整除,如果可以就代表有一段連續整數和為這個數字。因此 `ZZZ` 為 `1-i` 來讓 `x` 逐漸減去越來越大的數字。