# ==C 語言==解題研究社-張恩睿 ## [偶數、奇數判斷](https://onlinegdb.com/hk8LjAhqw) :::success ```C= #include <stdio.h> int main() { int x ; printf("請輸入一個數字\n"); while(scanf("%i",&x) != EOF){ if ( x % 2 == 0 )//一個數除以2商為0就是偶數 printf("是偶數\n"); if ( x % 2 != 0 )//一個數除以2商為1就是奇數 printf("是奇數\n"); } } ``` ::: ## [是否可圍成三角形、是甚麼角三角形判斷](https://onlinegdb.com/Wy_pOTN9q) :::info ```C= #include <stdio.h> int main() { int a , b , c , temp; while(1){ printf("請輸入三個數字\n"); scanf("%i%i%i",&a,&b,&c); // 讓a<b<c if (a > b){//a和b互換 temp = a; a = b; b = temp; } if (b > c){//b和c互換 temp = b ; b = c; c = temp; } if (a + b > c){//當最小的兩段>最大的一段,則可圍成三角形 printf("可圍成三角形、"); if(a * a + b * b == c * c)//當a²+b²=c²,就是直角三角形 printf("直角三角形\n"); if(a * a + b * b > c * c)//當a²+b²>c²,就是銳角三角形 printf("銳角三角形\n"); if(a * a + b * b < c * c)//當a²+b²<c²,就是鈍角三角形 printf("鈍角三角形\n"); } else printf("不可圍成三角形\n"); } } ``` ::: ## [質數、合數判斷](https://onlinegdb.com/UCW6P01Sw) :::warning ```C= #include <stdio.h> int main() { int n , i = 2, is_prime = 1; printf("請輸入一個數字\n"); while(scanf("%i",&n)!=EOF){ if(n == 1) printf("既不是質數,也不是合數"); i = 2, is_prime = 1; while(i < n){ if(n % i == 0){ is_prime = 0; printf("%i、", i); } i++; } if(is_prime == 0){ printf("\b是%i的因數\n",n); printf("是合數\n"); } else printf("是質數\n"); } } ``` ::: ## [平年、閏年判斷](https://onlinegdb.com/USZt8ifhx) :::danger ```C= #include <stdio.h>//閏年的規則,每四年閏一次,但是每一百年不閏,遇到四百年還是要閏 int main() { int year; printf("請輸入年份\n"); while(scanf("%i",&year)!=EOF){ if( year % 400 == 0){//除以400的餘數為0,則為閏年 printf("閏年\n"); } else if (year % 100 == 0){//再除以100的餘數為0,則為平年 printf("平年\n"); } else if(year % 4 == 0){//再除以4的餘數為0,則為閏年 printf("閏年\n"); } else{ printf("平年\n");//餘為平年 } printf("\n請輸入年份\n"); } }#include <stdio.h> //閏年的規則,每四年閏一次,但是每一百年不閏,遇到四百年還是要閏 int main() { int year; printf("請輸入年份\n"); while(scanf("%i",&year)!=EOF){ if( year % 400 == 0)//除以400的餘數為0,則為閏年 printf("閏年\n"); else if (year % 100 == 0)//再除以100的餘數為0,則為平年 printf("平年\n"); else if(year % 4 == 0)//再除以4的餘數為0,則為閏年 printf("閏年\n"); else printf("平年\n");//餘為平年 } } ``` ::: ## [占卜](https://onlinegdb.com/nAs9buXwmn) :::success ```C= #include <stdio.h> int main() { int M , D; printf("請輸入月份、日期(例:12月31日,輸入1231)\n"); while(scanf("%2d%2d",&M,&D) != EOF){ int sum =(M*2+D)%3; switch(sum) { case 0://當sum是0時印出"兇" printf("兇\n"); break; case 1://當sum是1時印出"吉" printf("吉\n"); break; case 2://當sum是2時印出"大吉" printf("大吉\n"); break; } } } ``` ::: ## [泡沫排序法](https://onlinegdb.com/mChrkCkvw) :::info ```C= #include <stdio.h> int main() { int n[9] ; int i, j, temp, input; while(1){ printf("請問有幾個數字要排列\n"); scanf("%i",&input); printf("請輸入%i個數字\n",input); for (i = 0; i < input; i++) scanf("%i",&n[i]); for ( j = 0; j < input-1; j++){ for ( i = 0; i < input-1-j; i++){ if ( n[i] > n [i+1]){ temp = n[i]; n[i] = n[i+1]; n[i+1] = temp; } } } for (i = 0; i < input; i++) printf("%i、",n[i]); printf("\b \n"); } } ``` ::: ## 費波那契數列 - [費波那契數列-陣列解法](https://onlinegdb.com/cJ4AdI4-E) :::warning ```C= #include <stdio.h> int main() { int n , i ,fib[100]; while(1){ fib[0] = 1; fib[1] = 1; printf("請問要查費波那契數列的第幾項?\n"); scanf("%i",&n); for (i = 2; i < n; i++) fib[i] = fib[i-2]+fib[i-1]; printf("費波那契數列的第%i項是%i\n",n,fib[n-1]); } } ``` ::: - [費波那契數列-非陣列解法](https://onlinegdb.com/ptoxoL64k) :::danger ```C= #include <stdio.h> int main() { int n1 = 1, n2 = 1, answer, i, n ; while(1){ printf("要查費波那契數列的第幾項?\n"); scanf("%i",&n); if(n < 3) printf("費波那契數列的第%i項是1\n",n); else{ for(i = 3; i <= n; i++){ answer = n1 + n2; n1 = n2; n2 = answer; } printf("費波那契數列的第%i項是%i\n",n,answer); } } } ``` ::: - [函式遞迴法](https://onlinegdb.com/U_TzJzFuQp) :::success ```C= #include <stdio.h> int f(int n){ int i, fib[100]; if(n == 0) return 0; if(n == 1) return 1; return f(n - 2) + f(n - 1); } int main() { int input; while(1){ printf("要查費波那契數列的第幾項?\n"); scanf("%i",&input); printf("費波那契數列的第%i項是%i\n",input,f(input)); } } ``` ::: - [冒牌](https://onlinegdb.com/uoMgqIR8_6) :::warning ```C= #include <stdio.h> int f(int n){ if(n == 1) return 10; if(n == 2) return 15; if(n == 3) return 16; return f(n - 2) + f(n - 3); } int main() { int n; while(1){ scanf("%i",&n); printf("%i\n",f(n)); } } ``` ::: ## 最大公因數、最小公倍數 - [最大公因數、最小公倍數-輾轉相除法](https://onlinegdb.com/oj8VxCjjU) :::info ```C= #include <stdio.h> int main() { int num1 ,num2 ,remainder,product,LCM; while(1){ printf("請輸入二個數字\n"); scanf("%i\n%i",&num1,&num2); product = num1 * num2; while( num2 != 0){ remainder = num1 % num2; num1 = num2; num2 = remainder; } printf("最大公因數是%i\n",num1); LCM = product /num1; printf("最小公倍數是%i\n",LCM); } } ``` ::: - [最大公因數、最小公倍數-非輾轉相除法](https://onlinegdb.com/1mFFZqADC) :::warning ```C= #include <stdio.h> int main() { int num1 , num2 , num2_old ,LCM;//num2_old:沒有改變的num2 printf("請輸入二個數字(請勿輸入質數)\n"); while(scanf("%i\n%i",&num1,&num2)!=EOF){ num2_old = num2; while( num2 != 1)//num2會一直減少直到1 { if (num1 % num2 == 0 & num2_old % num2 == 0){//num1被num2整除或原始的num2_old被num2整除代表此時的num2為最大公因數 printf("最大公因數是%i\n",num2); LCM = (num1 * num2_old)/num2;//最大公因數為LCM printf("最小公倍數是%i\n",LCM); break; } num2 = num2 -1; } printf("\n請輸入二個數字(請勿輸入質數)\n"); } } ``` ::: ## 1加到n的計算式 - [1加到n的計算式-while迴圈](https://onlinegdb.com/UWlymm_7Si) :::danger ```C= #include <stdio.h> int main() { int start = 0, end, sum = 0 ; printf("要加到多少?\n"); while(scanf("%i",&end)!=EOF){ start = 0, sum = 0 ; while (start <= end){ sum = sum + start; start++; } printf("1加到%i總和是%i\n",end, sum); printf("\n要加到多少?\n"); } } ``` ::: - [1加到n的計算式-for迴圈](https://onlinegdb.com/LJ2YLnSfU) :::success ```C= #include <stdio.h> int main() { int start , end ,sum = 0; printf("要加到到多少?\n"); while(scanf("%i",&end)!=EOF){ for ( start = 0; start <= end ;start++ ){ sum = sum + start; } printf("1加到%i總和是%i\n",end,sum); printf("\n要加到到多少?\n"); } } ``` ::: ## [a053: Sagit's 計分程式](https://onlinegdb.com/-vzZFpbmS) :::info ```C= #include <stdio.h> int main(){ int n , grade; printf("請問答題數是多少?\n"); while(scanf("%i",&n)!=EOF){ if( n >= 0 & n <= 10){ grade = n*6; } else if( n <= 20){ grade = (n-10)*2+60; } else if ( n <= 40){ grade = (n-20)+80; } else { grade = 100; } printf("分數是%i\n",grade); printf("\n請問答題數是多少?\n"); } } ``` ::: ## [終極密碼](https://onlinegdb.com/CXTeMxJwBK) :::warning ```C= #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int x ,i = 0, input , min = 1, max = 100;//設x為亂數,範圍1~99 srand(time(0)); x = rand()%99+1; printf("請輸入一個介於1到100間的數字\n"); while(scanf("%i",&input) != EOF){ while(input != x){ if(input < min||input > max){ printf("超出範圍!\n%i~%i\n",min,max); break; } if(input > x){ max = input; printf("%i~%i\n",min,max); i++; break; } if(input < x){ min = input; printf("%i~%i\n",min,max); i++; break; } } if(input == x){ //猜中 i++; printf("恭喜!猜第%i次就猜中!\n",i); printf("\n請輸入一個介於1到100間的數字\n"); min = 1,max = 100; srand(time(0)); x = rand()%99+1; } } } ``` ::: ## [等差數列](https://onlinegdb.com/dn_PP780M) :::danger ```C= #include <stdio.h> int main() { int a[100], d, i, n, sum , x,unlimited = 0; printf("等差數列的首項是多少?\n"); scanf ("%i" ,&a[0]); printf("等差數列的公差是多少?\n"); scanf("%i",&d); printf("你要查詢數列的哪一項?\n"); scanf("%i",&n); for(i = 0; i < n; i++){ a[i+1] = a[i] + d; } printf("數列的第%i項是%i\n",n,a[n-1]); for(i = 0; i < n; i++){ sum = sum + a[i]; } printf("數列的第1項加到第%i項的和是%i",x,sum); } ``` ::: ## [幾A幾B](https://onlinegdb.com/4Z_AJqBe5) :::success ```C= #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int answer , input , a, b, c, x, y, z, A = 0, B = 0; do{ srand(time(0)); answer = rand()%999+100; a = answer / 100; b = answer / 10 % 10; c = answer % 10; } while(a == b || b == c || a == c); printf("請輸入數字(無相同數字的數字、開頭為0的數字)\n"); while(scanf("%i",&input) != EOF){ x = input / 100; y = input / 10 % 10; z = input % 10; if(z == c) A++; if(y == b) A++; if(x == a) A++; if(z == b) B++; if(z == a) B++; if(y == c) B++; if(y == a) B++; if(x == c) B++; if(x == b) B++; printf("%iA%iB\n",A,B); A = 0, B = 0; if(input == answer){ printf("猜對了!\n"); do{ srand(time(0)); answer = rand()%999+100; a = answer / 100; b = answer / 10 % 10; c = answer % 10; } while(a == b || b == c || a == c); printf("請輸入數字(無相同數字的數字、開頭為0的數字)\n"); } } } ``` ::: ## [英文單字練習](https://onlinegdb.com/cbHrsmslhm) :::info 內容過長請自行點擊以下連結觀看 <https://onlinegdb.com/3eEi_pszdD> ::: ## APCS觀念題 - [4](https://onlinegdb.com/Vn9PKp_7j5) :::warning ```C=C= #include <stdio.h> int main() { int i,b[100],a[100]; for (i = 1; i <= 100; i = i + 1){ b[i] = i; } a[0] = 0; for(i = 1; i <= 100; i = i + 1){ a[i] = b[i] + a[i - 1]; } printf("%i\n",a[50] - a[30]); } ``` ::: - [5](https://onlinegdb.com/8moXt7_oC) :::danger ```C= #include <stdio.h> int f(int n){ int sum = 0, count; if(n < 2){ return 0; } for(int i = 1; i <= n; i = i + 1){ sum = sum + i; count++; } sum = sum + f(2 * n / 3); return count; } int main() { printf("%i",f(1000)); return 0; } ``` ::: - [10](https://onlinegdb.com/PC4vroc--) :::success ```C= #include <stdio.h> void f(int x, int y){ int tem = x; x = y; y = tem; } int main() { int x = 2, y = 3; f(x,y); printf("%i",(x-y)*(x+y)/2); return 0; } ``` ::: - [11](https://onlinegdb.com/YRIlbs9oc) :::info ```C= #include <stdio.h> int main() { int k = 4, m = 1; for(int i = 1; i <= 5; i = i+1){ for(int j = 1; j <= k; j = j+1){ printf(" "); } for(int j = 1; j <= m; j = j+1){ printf("*"); } printf("\n"); k = k - 1; m = m + 2; } } ``` ::: - [17](https://onlinegdb.com/8HNxbAvfN) :::warning ```C= #include <stdio.h> int a(int n, int m){ if(n < 10){ if(m < 10){ return n + m; } else{ return a(n, m - 2) + m; } } else{ return a(n - 1, m) + n; } } int main() { printf("%i", a(13,15)); } ``` ::: - [20](https://onlinegdb.com/0G7HJCy0JM) :::danger ```C= #include <stdio.h> int g(int a){ if(a > 1){ return g(a - 2)+3; } return a; } int main() { printf("%i",g(13)); } /* g(13) = g(11)+3 = g(9)+3×2 = g(7)+3×3 = g(5)+3×4 = g(3)+3×5 = g(1)+3×6 = 1+18 =19 */ ``` ::: ## 階乘問題 - [遞迴法](https://onlinegdb.com/pXMpbD008) :::success ```C= #include <stdio.h> /*利用遞迴法計算階乘問題*/ int f(int n){ if(n == 1) return 1; return n * f(n - 1); } int main() { int input; while(scanf("%i",&input)!= EOF) printf("%i\n",f(input)); } ``` ::: - [迭代法](https://onlinegdb.com/7fdpkn4Hvx) :::info ```C= #include <stdio.h> /*利用迭代法計算階乘問題*/ int f(int n){ int i,sum = 1; for(i = 1; i <= n; i++) sum = sum * i; return sum; } int main() { int input; while(scanf("%i",&input)!= EOF) printf("%i\n",f(input)); } ``` ::: ## [身分證驗證](https://onlinegdb.com/epDZCMgGL) :::warning ```C= #include <stdio.h> int main() { char city, num[12]; int i, sum; while(1){ printf("請輸入身分證字號\n"); scanf("%c",&city); scanf("%s",num); if(city < 73) city -= 55; else if(city == 73) city = 34; else city -= 56 ; for(i = 0; i <= 8; i++) num[i] -= 48; for(i = 0; i < 8; i++) sum = sum + num[i] * (8 - i); sum = sum + num[8] + city / 10 + (city % 10) * 9; if(sum % 10 == 0) printf("✔我不是機器人\n"); else printf("✖我是被撿來的\n"); } } ``` ::: ## [找錢機器](https://onlinegdb.com/4EJrnMaJH) :::danger ```C= #include <stdio.h> int main() { int money, cash_100, cash_50, cash_10, cash_5, cash_1; while(1){ printf("請輸入要找的金額\n"); scanf("%i", &money); while(money >= 100){ money -= 100; cash_100 ++; } while(money >= 50){ money -= 50; cash_50 ++; } while(money >= 10){ money -= 10; cash_10 ++; } while(money >= 5){ money -= 5; cash_5 ++; } while(money >= 1){ money -= 1; cash_1 ++; } printf("100元:%i張\n50元:%i個\n10元:%i個\n5元:%i個\n1元:%i個\n",cash_100, cash_50, cash_10, cash_5, cash_1); } } ``` ::: ## ZeroJudge - [d570. 神龍見首不見尾](https://onlinegdb.com/LH7N27OHM) :::warning ``` #include <stdio.h> // 輸入只有一行,含有一個正整數 n 。 // n 如果有 k 位數,就輸出 k 行,第一行輸出 n,第二行以後每行都比上一行少一個尾數。 int main() { int input; scanf("%i",&input); printf("%i\n",input); while(input >= 10){ input = input / 10; printf("%i\n",input); } } ``` ::: - [b970. 我不說髒話 (續)](https://onlinegdb.com/7XIuBIryu) :::info ``` #include <stdio.h> // 輸入只有一行,其中含有一個正整數 n,代表文文被罰寫的次數。 // 輸出 n 行「I don't say swear words!」,每行前面要有流水編號。 int main() { int input, i = 1; while(1){ scanf("%i",&input); for(input > 0;input--;i++) printf("%i. I don't say swear words!\n",i); } } ``` :::