---
# System prepended metadata

title: 資工三乙 許皓翔
tags: [C, A series, ZERO JUDGE]

---

###### tags: `ZERO JUDGE` `C` `A series`
# 資工三乙 許皓翔
# A
:::spoiler <font size=4>**a006: 一元二次方程式**</font>
``` c=
# include <stdio.h>
# include <math.h>
int main(void)
{
	int a, b, c;
	scanf("%d %d %d", &a, &b, &c);
	int z = (b * b) - (4 * a * c);
	int r1 = (-b + sqrt(z)) / (2 * a);
	int r2 = (-b - sqrt(z)) / (2 * a); 
	if(z > 0)
		printf("Two different roots x1=%d , x2=%d\n", r1, r2);
	else if(z == 0)
		printf("Two same roots x=%d\n", -b / (2 * a));
	else
		printf("No real root\n"); 
}
```
:::warning
<font size=5>**解題思路**</font>
國中教過的公式解 $\Rightarrow x = \dfrac{-b \pm \sqrt{b^{2}-4ac}}{2a}$

判別式 $D = \sqrt{b^{2}-4ac}$

再用判別式的大小來判斷是否存在根(root) and 兩根為多少

**2023/1/17**
:::


:::spoiler <font size=4>**a009: 解碼器**</font>
```c=
# include <stdio.h>
# include <string.h>

int main(void)
{
	char ip[1000];
	gets(ip);
	for(int i = 0; i < strlen(ip); i++)
		printf("%c", ip[i] - 7);
}
```

:::warning
<font size=5>**解題思路**</font>
用題目的 **密碼** 來判斷金鑰K為多少(K = 7)
再反推回去 **明碼**

**2023/1/19**
:::




:::spoiler <font size=4>**a013 羅馬數字**</font>
主函式部分:
```c=
# include <stdio.h>
# include <string.h>
int romanToInt(char str[]);
int getValue(char);
void intToRoman(int);
int abs(int);

int main(void)
{
	char str1[100];
	char str2[100];
	int a, b;// a 為被減數 b 為減數
	while(scanf("%s", str1))
	{
		if(str1[0] == '#')
			break;
		scanf("%s", str2);
		a = romanToInt(str1);
		b = romanToInt(str2);
		if(abs(a - b) == 0)
			printf("ZERO\n");
		else
			intToRoman(abs(a - b));
	}
}
```
羅馬數字轉阿拉伯數字:
```c=+
int romanToInt(char str[])
{
	int z, sum = 0;
	for(int i = 0; i < strlen(str); i++)
	{
		z = getValue(str[i]);
		if(i == strlen(str) - 1)
		{
			sum += z;
			break;
		}
		else if(z < getValue(str[i + 1]))
			sum -= z;
		else
			sum += z;
	} 
	return sum;
}
```
讓每個羅馬字查詢自己對應的阿拉伯數字之函數:
```c=+
int getValue(char ch)
{
	char str[] = "MDCLXVI";
	int num[] = {1000, 500, 100, 50, 10, 5, 1};
	for(int i = 0; i < strlen(str); i++)
	{
		if(ch == str[i])
			return num[i];
	}
}
```
阿拉伯數字轉羅馬數字:
```c=+
void intToRoman(int x)
{
	char str[][3] = {"I", "IV", "V", "IX", "X", "XL", "L", "XC", "C", "CD", "D", "CM", "M"};
	int num[] = {1, 4, 5, 9, 10, 40, 50, 90, 100, 400, 500, 900, 1000};
	int n = 12;
	int z; // z 為餘數
	while(n > 0)
	{
		int d; // d 為商
		if(num[n] <= x)
		{
			z = x % num[n];
			d = x / num[n];
			if(d > 1)
			{
				for(int i = 0; i < d; i++)
					printf("%s", str[n]);
			}
			else
				printf("%s", str[n]);
			x = z;
		}
		n --;
	}
	for(int i = 0; i < x; i++)
		printf("%c", 'I');
	printf("%c", '\n');
}
```
絕對值函數:
```c=+
int abs(int x)
{
	if(x < 0)
		return -x;
	else
		return x;
}
```
:::warning 
<font size=5>**解題思路**</font>
``intToRoman():``
1.
建立一個由小->大排序的除數陣列 num (其實大->小也行, 只要讓 n 初值=0)
再建立一個與其對應的羅馬數字的字串陣列 str 
2.
遍歷 num 中的所有元素並讓 被除數x 與其進行運算(與 x 相除取餘數z), 並且只有除數比被除數小的才可以進行運算
3.
變數 d 用來紀錄運算後的商 
以除數=num[4] (對應到str[4]="x")為例, 若運算後 d = 3 代表 "x" 有三個(就要printf()三次)

``romanToInt()``
// 想法源自leetcode 13. Roman to Integer
對於傳入的羅馬字串中若當前那個字元所對應的阿拉伯數字(利用getValue()查詢)小於下一個字元的,視為特殊情況, 若當前字元之阿拉伯數字為1, 下一個字元為5, 就把 1 視為 -1(因為羅馬人規定IV=4 故可推斷IV為-1+5計算而來), 因為在對羅馬數字進行其阿拉伯數值轉換計算時的 sum值 不一定都全為往上加(特殊情況時會減)

**2023/1/21**
 
:::

:::spoiler <font size=4>**a044 空間切割**</font>
```c=
# include <stdio.h>

int main(void)
{
	int n;
	while(scanf("%d", &n) != EOF)
		printf("%d\n", (power(n, 3) + (5 * n) + 6) / 6); 
}

int power(int x, int n)
{
	if(n == 0)
		return 1;
	else
		return x * power(x, n - 1);
}
```
:::warning
<font size=5>**解題思路**</font>

空間中 n 個平面切割空間的公式

$Sn = \dfrac{n^{3}+5n+6}{6}$

**2023/1/22**
:::



