# Sample Code HW3
#### [Back to Computer Programming (I)](https://hackmd.io/9tPBK8QATpCD5UQ0uvAZ-g?both)
###### tags: `NTNU` `CSIE` `必修` `Programming(I)`
## hw0301


### Author : Hsuan-Yu
```c=
//author : Hsuan-Yu
#include <stdio.h>
int factorial( int number ) ;
int main ()
{
int k = 0 ;
double answer = 1 ;
printf("k-th order Taylor polynomial for e\n") ;
printf("Please enter k:") ;
scanf("%d",&k) ;
for (int i = 1 ; i <= k ; i += 1 )
{
answer += (double)( 1.0/factorial(i) ) ;
}
printf("%lf\n",answer) ;
return 0 ;
}
//function of factorial
int factorial( int number )
{
if ( number == 0 )
{
return 1 ;
}
else if ( number == 1 )
{
return 1;
}
else
{
return ( number * factorial( number - 1 ) );
}
}
```
### Author : Joseph Tu
```c=
#include <stdio.h>
#include <stdint.h>
int main(){
int64_t factorial = 1;
int32_t i,k;
double e = 2;
printf("k-th order Taylor polynomial for e\n");
printf("Please enter k: ");
scanf("%d",&k);
for(i = 2;i <= k;i++){
factorial *= i;
e += (1.0/factorial);
}
printf("%.15lf\n",e);
return 0;
}
```
### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>
int main(){
char check[1000];//建立一個字元陣列
int32_t i, n;
printf("k-th order Taylor polynomial for e\n");
printf("Please enter k: ");
while(fgets(check, 1000, stdin)){//當輸入進新的"一行"
bool incorrect = false;//用來檢查是否輸入錯誤
n = 0;//用來存放最後的數字
for(i = 0; i < strlen(check) - 1;i++){//對字串中每個字元作檢查
if(check[i] - '0' > 9 || check[i] - '0' < 0){//如果這個字元不屬於0~9
printf("Please enter the right k: ");//提示錯誤
incorrect = true;//紀錄錯誤
break;//因為已經有錯了,所以直接跳出
}
n = n * 10 + (check[i] - '0');//將這個字元代表的值加進n
}
if(incorrect)//偵測到錯誤,重新開始
continue;
break;//因為沒有錯誤,跳出迴圈
}
float ansf = 1;
double ansd = 1;
double muilt = 1.0;
for(i = 1; i <= n; i++){
muilt /= i;//下一個要加上去的1/i!
ansf += muilt;
ansd += muilt;
}//計算泰勒公式
int32_t precisionf = 0, precisiond = 0;
for(i = 0; ; i++){
if(ansf * pow(2, i) == (int)(ansf * pow(2, i)) || i > 25){
precisionf = i;
break;
}//計算float小數後有幾位
}
for(i = 0; ; i++){
if(ansd * pow(2, i) == (int)(ansd * pow(2, i)) || i > 49){
precisiond = i;
break;
}//計算double小數後有幾位
}
//根據小數位數輸出
printf("The answer within float: %.*f\n", precisionf, ansf);
printf("The answer within double: %.*lf\n", precisiond, ansd);
return 0;
}
```
## hw0302

##### 寫在開始的一段話 by芮芮
> 可能很多人一開始第一個想法是使用排列組合比較好
> 那我們來聊聊使用陣列和C m取n的差異吧(粗略)(大量廢話警告)(最下面有懶人包)
>
> 陣列:
> 每讀到一格陣列,將他的值更新成上一層的兩個值相加
> 所以要跑完整個帕斯卡三角形需要(層數) * (層數 + 1) / 2次的加法運算
> 空間最少需要相當於最底層的大小,也就是(層數)
>
> 排列組合有兩種寫法:
>
> C m取n(不用陣列存階乘):
> 每輸出一格數字,計算 m!/ n! / (m - n)!
> 由於C語言算階乘的方式是用迴圈一個一個乘上去
> 每個數字需要 m + n + (m - n) = 2 * m = (當前層數) * 2 的乘除法運算
> 所以整個帕斯卡三角形需要作(層數) * (層數 + 1) * (2 * 層數 + 1)次的乘除法運算
> 嘖嘖,這和上面相比可是一個很大的數
> 而且階乘會比兩數相加更快達到int限制
> 所以C m取n能算的三角形大小還比陣列小
>
> C m取n(用陣列存階乘結果):
> 和上面相比,這個做法每種階乘只要作一次就能用記錄的值運算整個三角形了
> 所以每個數字需要2次的乘除法運算
> 整個三角形需要 (層數) * (層數 + 1) 的乘除法運算
> 注意到了嗎? 就算用陣列去除掉重複計算的時間
> 排列組合還是比陣列慢
> 更別提為了開陣列存階乘,所需的空間上升到和與陣列方法相同的(層數)
>
> 我知道你們都不想看上面那一大串
> 那就讓我們愉快地進入懶人包吧:
>
| 所用方法(層數=n) | 所需運算次數 | 所需額外空間 | 在int32_t可以輸出的最大層數 |
|:--------------------:|:-------------------------------:|:------------:|:---------------------------:|
| 陣列方法 | n * (n + 1) / 2 (加法) | n | 73 |
| 排列組合 | n * (n + 1) * (2n + 1) (乘除) | 0 | 73 |
| 排列組合(陣列記階乘) | n * (n + 1) (乘除) | n | 13 |
| 勝利者 | 陣列方法 | 排列組合 | 陣列方法&排列組合 |
> 可以看到除了所需空間,陣列方法都>=排列組合
> 可是就算是輸出到73層,陣列方法也只需要73大小的陣列
> 也就是說73 * 4 = 292個Bytes
> 當需要輸出到73層的時候,你會願意為了省292個bytes而多花294倍的時間嗎?
### Author : 芮芮
```c=
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdbool.h>
int main(){
printf("Please enter the height of a Pascal 's Triangle (1-10): ");
int32_t PascalTriangle[11] = {0}, i, j, n = 0;//宣告必要變數
PascalTriangle[1] = 1;//初始化
char check[1000];//建立一個字元陣列
while(fgets(check,1000,stdin)){//當輸入進新的"一行"
bool incorrect = false;//用來檢查是否輸入錯誤
n = 0;//用來存放最後的數字
for(i = 0; i < strlen(check) - 1;i++){//對字串中每個字元作檢查
if(check[i] - '0' > 9 || check[i] - '0' < 0){//如果這個字元不屬於0~9
printf("Please enter the right height: ");//提示錯誤
incorrect = true;//紀錄錯誤
break;//因為已經有錯了,所以直接跳出
}
n = n * 10 + (check[i] - '0');//將這個字元代表的值加進n
}
if(incorrect)//偵測到錯誤,重新開始
continue;
if(n > 10 || n < 1){//如果這個數字不屬於1~10
printf("Please enter the right height: ");//提示錯誤
continue;//重新開始
}
break;//沒有錯誤,跳出迴圈
}
for(i = 0; i < n; i++){//作n次
for(j = 10; j > 0; j--){//從後面往前讀陣列裡的值
if(PascalTriangle[j] != 0)//如果不是0(未使用),則輸出
if(j != 1)//如果不是最後一項
printf("%d ", PascalTriangle[j]);
else//最後一項
printf("%d\n", PascalTriangle[j]);
PascalTriangle[j] = PascalTriangle[j] + PascalTriangle[j-1];//將現在的值更新為上層兩個值相加
}
}
}
```
### Author : Joseph Tu
```c=
/*Author : Joseph Tu*/
#include <stdio.h>
#include <stdint.h>
int main(){
int32_t high,i,j,p[10] = {0};
p[0] = 1;
printf("Please enter the height of a Pascal's Triangle (1-10): ");
scanf("%d",&high);
if(high<1||high>10){
printf("Wrong Input!\n");
return 0;
}
for(i = 0;i < high;i++){
for(j = i;j > 0;j--)
p[j] += p[j-1];
printf("%d",1 );
for(j = 1;j <= i;j++)
printf("%4d",p[j]);
printf("\n");
}
return 0;
}
```
## hw0303

### Author : Joseph
```c=
#include <stdio.h>
#include <stdint.h>
int main(){
int32_t month,i,j,k;
double rate[3],amount[3] = {0};
printf("Please enter your monthly investment amount (1000-50000): ");
scanf("%d",&month);
printf("Please enter your anticipated annual rate (%%): ");
scanf("%lf",&rate[1]);
rate[0] = rate[1] + 3;
rate[2] = rate[1] - 3;
for(i = 1;i <= 20;i++){
for(j = 0;j < 12;j++)
for(k = 0;k < 3;k++){
amount[k] += month;
amount[k] *= (1.0+rate[k]/1200.0);
}
printf("Year %02d: %10.0lf (max) %10.0lf (average) %10.0lf (min)\n",i,amount[0],amount[1],amount[2]);
}
return 0;
}
```
## hw0304

### Author : 芮芮
```c=
```
### Author : Joseph Tu
```c=
#include <stdio.h>
#include <stdint.h>
#include <math.h>
int main(){
int32_t n,num,i = 2,j,sum;
printf("Please enter n (1-50000000): ");
scanf("%d",&n);
num = (pow(2,i-1)*(pow(2,i)-1));
while(num < n){
sum = 1;
for(j = 2;j <= sqrt(num);j++)
if(!(num % j)){
sum += j;
sum += num/j;
}
if(sum == num)
printf("%d\n",sum);
i++;
num = (pow(2,i-1)*(pow(2,i)-1));
}
return 0;
}
```
## hw0305

### Author : Joseph Tu
```c=
#include <stdio.h>
#include <stdint.h>
int main(){
int32_t num,sum;
printf("Please enter a number: ");
scanf("%d",&num);
while(num / 10){
sum = 0;
while(num){
printf("%d",num % 10 );
if(num / 10)
printf(" + ");
sum += num % 10;
num /= 10;
}
printf(" = %d\n",sum);
num = sum;
}
printf("Final: %d\n",num);
return 0;
}
```
C++版
```cpp=
#include <iostream>
#include <cstdint>
using namespace std;
int main(){
int32_t num,sum;
printf("Please enter a number: ");
cin >> num;
while(num / 10){
sum = 0;
while(num){
cout << num % 10 ;
if(num / 10)
cout << " + ";
sum += num % 10;
num /= 10;
}
cout << " = " << sum << endl;
num = sum;
}
cout << "Final: " << num << endl;
return 0;
}
```
Java版
```java=
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum;
System.out.print("Please enter a number: ");
int num = sc.nextInt();
while(num / 10 != 0){
sum = 0;
while(num != 0){
System.out.print(num % 10 );
if(num / 10 != 0)
System.out.print(" + ");
sum += num % 10;
num /= 10;
}
System.out.println(" = " + sum);
num = sum;
}
System.out.println("Final: " + num);
sc.close();
}
}
```
Python版
```python=
num = input("Please enter a number: ")
num = int(num)
while (num // 10) != 0:
sum = 0
while num != 0:
print(num%10 , end=' ')
if (num // 10) != 0:
print("+" , end=' ')
sum = sum + (num % 10)
num = num // 10
print("= " + str(sum))
num = sum
print('Final: '+ str(num))
```
## hw0306

```c=
#include <stdint.h>
#include <stdio.h>
unsigned int ui = 0;
unsigned short us = 0;
signed int si = -1;
int main()
{
int64_t r1 = ui + si;
int64_t r2 = us + si;
printf("%ld %ld\n", r1, r2);
}
```
