# Sample Code HW3 #### [Back to Computer Programming (I)](https://hackmd.io/9tPBK8QATpCD5UQ0uvAZ-g?both) ###### tags: `NTNU` `CSIE` `必修` `Programming(I)` ## hw0301 ![](https://i.imgur.com/UByjLvg.jpg) ![](https://i.imgur.com/OA11M44.jpg) ### 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 ![](https://i.imgur.com/MfymbID.jpg) ##### 寫在開始的一段話 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 ![](https://i.imgur.com/rXgQN6G.jpg) ### 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 ![](https://i.imgur.com/lq1Yy6m.jpg) ### 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 ![](https://i.imgur.com/RbsLze2.jpg) ### 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 ![](https://i.imgur.com/sCC8dWR.jpg) ```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); } ``` ![](https://i.imgur.com/MkZaBmA.jpg)