# ==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);
}
}
```
:::