###### tags: `多元選修`
# 基礎程式設計
<br />
## 一、CH1 變數與運算子
1. ### a001 哈囉
- 輸入 一個字串
- 輸出 hello, 你所輸入字串
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[])
{
string str;
while (cin>>str)
{
cout<<"hello, "<<str<<endl;
}
return 0;
}
```
2. ### a002 簡易加法
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main(int argc, const char * argv[])
{
int a,b;
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 0;
}
```
3. ### d489 伏林的三角地
- 海龍公式計算三角形面積
- 須使用整數型別否則會有誤差
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
unsigned long long int a,b,c;
while(cin>>a>>b>>c)
{
int s;
s = (a+b+c)/2;
s = s*(s-a)*(s-b)*(s-c);
cout<< s << endl;
}
return 0;
}
```
4. ### d827 買鉛筆
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
int num;
while (cin>>num)
{
if(num<12)
{
cout<<5*num<<endl;
}
else
{
if(num==12)
{
cout<<50<<endl;
}
int sum;
sum=num/12;
cout<<((num%12)*5)+(50*sum)<<endl;
}
}
return 0;
}
```
5. ### d060 還要等多久啊?
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
unsigned int a;
while(cin>>a)
{
a >25 ? cout<<60-a+25 : cout<<25-a;
}
return 0;
}
```
6. ### d485 我愛偶數
```cpp=
#include <iostream>
#include <cmath>
int main()
{
int x,y,count;
while(std::cin>>x>>y)
{
while(x<=y)
{
if((x%2)==0)
{
count++;
}
x++;
}
std::cout<<count;
}
return 0;
}
```
7. ### d051 糟糕,我發燒了!
```cpp=
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double f;
while(std::cin>>f)
{
f=(f-32)*5/9;
cout<<fixed<<setprecision(3)<<f;
}
return 0;
}
```
8. ### b004 繩子上吃草的牛
```cpp=
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()
{
double a,b,c,d,p;
p = 4*atan(1);
while(cin>> a >> b)
{
if(a<b)
{
int t;
t=a;
a=b;
b=t;
}
c = a/2;
d = sqrt((a/2*a/2)-(b/2*b/2));
cout<<fixed<<setprecision(3)<< p*c*d << "\n";
}
return 0;
}
```
9. ### d039 11044 - Searching for Nessy
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n,m,t;
cin >> t;
while (cin>> n>> m)
cout << (n/3) * (m/3) << endl;
return 0;
}
```
<br />
## 二、CH2 條件判斷
1. ### a012 10055 - Hashmat the Brave Warrior
```cpp=
#include <iostream>
using namespace std;
int main()
{
long long int m,n,ans;
while(cin >> m >>n)
{
if( m>n )
{
cout << m-n << endl;
}
else
{
cout << n-m << endl;
}
}
return 0;
}
```
2. ### d065三人行必有我師
- &&運算子
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a,b,c;
while(cin>> a >> b >> c)
{
if(a>b&&a>c)
cout<< a << endl;
else
if(b>c)
cout<< b <<endl;
else
cout<< c << endl;
}
}
```
3. ### d984 棄保效應
```cpp=
#include <iostream>
using namespace std;
int main()
{
unsigned long long int a,b,c;
while(cin>> a >> b >> c)
{
if( (a>b+c) || ((c>a&&a>b) && a+b>c) || ((b>a&&a>c) && a+c>b) )
cout<< "A" << endl;
else if ( (b>a+c) || ((c>b&&b>a) && a+b>c) || ((a>b&&b>c) && b+c>a) )
cout<< "B" << endl;
else
cout<< "C" << endl;
}
return 0;
}
```
4. ### a004 文文的求婚
```cpp=
#include <iostream>
using namespace std;
int main()
{
int year;
while(cin>>year)
{
if((year%4)==0&&(year%100)!=0)
{
cout<<"閏年"<<endl;
}
else
{
if((year%4)==0&&(year%100)==0)
{
if((year)%400==0)
{
cout<<"閏年"<<endl;
}
else
{
cout<<"平年"<<endl;
}
}
else
{
cout<<"平年"<<endl;
}
}
}
}
```
<br />
## 三、CH3 重複結構
1. ### d490 我也愛偶數
- for
- i=i+1(i++)
- 變數初值,區塊變數 v.s. 區域變數
- 先練習1+2+3+…+n,int sum 除錯練習1
```cpp=
#include <iostream>
using namespace std;
int main()
{
int a, b;
while (cin>> a >> b)
{
int sum=0;
for (int i=a; i<=b; i++)
{
if(i%2==0)
sum+=i;
}
cout << sum << endl;
}
return 0;
}
```
2. ### d074 電腦教室
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
int maxx=-1,p;
for (int i=0;i<n;i++)
{
cin >> p;
if (p>maxx)
{
maxx=p;
}
}
cout << maxx << endl;
}
return 0;
}
```
3. ### a215 明明愛數數
- do_while迴圈
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(cin>> n >> m)
{
int count=0,sum=0;
do
{
sum+=n;
count++;
n++;
}
while(sum<=m);
cout<< count << endl;
}
return 0;
}
```
4. ### a024 最大公因數(GCD)
- 利用展轉相除法 (a=bq+r,則gcd(a, b) = gcd(b, r))
- 使時間複雜度降至O(log(n))
- do_while迴圈
```cpp=
#include <iostream>
using namespace std;
int main ()
{
int a,b;
while(cin>> a >> b)
{
int r = 0;
do
{
r = a%b;
a = b;
b = r;
}
while(r>0);
cout<< a << endl;
}
}
```
5. ### c418 Bert的三角形(1) c419 Bert的三角形(2)
- 巢狀迴圈(內外圈變數不能重複)
```cpp=
#include <iostream>
using namespace std;
int main ()
{
int n;
while(cin>> n)
{
for(int i=0; i < n; i++)
{
for(int j=0; j <=i ; j++)
{
cout<< "*";
}
cout<<endl;
}
}
return 0;
}
```
```cpp=
#include <iostream>
using namespace std;
int main ()
{
int n;
while(cin>> n)
{
for(int i=0; i < n; i++)
{
for(int k=0; k<n-i-1; k++)
{
cout<<"_";
}
for(int j=0; j <= i; j++)
{
cout<< "*";
}
cout<<endl;
}
}
return 0;
}
```
<br />
## 四、CH4 陣列
1. ### d212 東東爬階梯
- 一維陣列
- 費式數列
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n;
unsigned long long int f[100]={1,1}; //unsigned lon long int只能到f[92]
for(int i=2;i<100;i++)
f[i]=f[i-1]+f[i-2];
while(cin >> n)
cout << f[n] << endl;
return 0;
}
```
2. ### c067 Box of Bricks
- 一維陣列
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n,Set=1;
while(cin >> n && n>0)
{
int h[n],sum=0,ave,mov=0;
for (int i=0;i<n;i++)
{
cin >> h[i];
sum+=h[i];
}
ave=sum/n;
for (int i=0;i<n;i++)
{
if(h[i]>ave)
{
mov+=(h[i]-ave);
}
}
cout << "Set #" << Set++ << endl << "The minimum number of moves is " << mov << "." << endl << endl;
}
return 0;
}
```
3. ### a104 排序
- 利用insertion sort
```cpp=
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int M[n];
for(int i=0; i<n; i++)
cin>>M[i];
for(int i=1; i<n; i++)
{
int key=M[i],j=i-1;
while(M[j]>key && j>=0)
{
M[j+1]=M[j];
j--;
}
M[j+1]=key;
}
for(int i=0; i<n; i++)
cout<<M[i]<<" ";
cout<<endl;
}
return 0;
}
```
4. ### d452 二、直線最小距離和
- 利用selection sort
```cpp=
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
int n,T;
cin>>T;
while(T--)
{
cin>>n;
int M[n],sum=0;
for(int i=0; i<n; i++)
cin>>M[i];
for(int i=0; i<n-1; i++)
{
int index;
for(int j=i+1; j<n; j++)
{
if(M[index]>M[j])
index=j;
}
swap(M[index],M[i]);
}
for(int i=0; i<n; i++)
sum+=abs(M[n/2]-M[i]);
cout<<sum<<" ";
cout<<endl;
}
return 0;
}
```
5. ### d153 六、智力测验
- 時間複雜度O(n^2^)的排序法會TLE
- (n-1)+(n-2)+….+1=n(n-1)/2=n2/2-n/2,當n很大時,如1百萬時,500,000,000,000-500,000=499,999,500,000(n/2可以忽略)
- 其它排序演算法觀念
* [merge sort](http://alrightchiu.github.io/SecondRound/comparison-sort-merge-sorthe-bing-pai-xu-fa.html)
* [quick sort1](http://notepad.yehyeh.net/Content/Algorithm/Sort/Quick/Quick.php)
* [quick sort2](https://ithelp.ithome.com.tw/articles/10202330?sc=iThelpR)
- 排序演算法比較
* [Sorting Algorithms Animations](https://www.toptal.com/developers/sorting-algorithms)
* [Comparison Sorting Algorithms](https://www.cs.usfca.edu/~galles/visualization/ComparisonSort.html)
```cpp=
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char** argv)
{
int T,n;
cin>>T;
while(T--)
{
cin>>n;
int s[n];
for(int i=0; i<n; i++)
{
cin>>s[i];
}
sort(s,s+n);
cout<<(n%2==1 ? (s[n/2]) : (s[n/2-1])) <<endl;
}
return 0;
}
```
6. ### a694: 吞食天地二
- 二維陣列
- C++ IO加速
``` javascript
ios::sync_with_stdio(false);
cin.tie(0);
```
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int n,m;
while(cin>>n>>m)
{
int mat[n+1][n+1];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>mat[i][j];
while(m--)
{
int r1,r2,c1,c2,sum=0;
cin>>r1>>c1>>r2>>c2;
for(int i=r1; i<=r2; i++)
for(int j=c1; j<=c2; j++)
sum+=mat[i][j];
cout<<sum<<endl;
}
}
return 0;
}
```
<br />
## 五、CH5 字元陣列、字串
1. ### a149: 乘乘樂
- 改寫為以字元陣列方式讀入
- 字串結束符號 '\0'
```cpp=
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--)
{
int sum=1;
char n[11];
cin >> n;
for (int i=0;i<strlen(n);i++)
sum*=(int)n[i]-48;
cout << sum << endl;
}
return 0;
}
```
2. ### d124: 3的倍数
- 3的倍數判別法:各個數字和為3的倍數
```cpp=
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char n[10001];
while(cin>>n)
{
int sum=0;
for (int i=0;i<strlen(n);i++)
sum+=(int)n[i]-48;
cout << (sum%3==0?"yes":"no") << endl;
}
return 0;
}
```
3. ### a782: 4. Redundant Acronym Syndrome Syndrome
- getline(cin,字串名稱)
- toupper()將字元變大寫
```cpp=
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main(int argc, char** argv)
{
string line;
while(getline(cin,line) && line != "END")
{
int index;
cout<<(char)(toupper(line[0]));
for(int i=1; i<line.size(); i++)
{
if(line[i]==' ')
{
cout<<(char)(toupper(line[i+1]));
index=i+1;
}
}
cout<<" ";
for(int i=index; i<line.size(); i++)
cout<<line[i];
cout<<endl;
}
return 0;
}
```
4. ### a011: 00494 - Kindergarten Counting Game
- 不能只算空的數量,字母的前一個是非字母即一個字
- 不能使用cin >> s
- cin.getline(s,1000)
- isalpha()
```cpp=
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main(int argc, char** argv)
{
string line;
while(getline(cin,line))
{
int sum=0;
for(int i=0; i<line.size(); i++)
if(isalpha(line[i]) && !isalpha(line[i-1]))
sum++;
cout<<sum<<endl;
}
return 0;
}
```
5. ### a022: 迴文
- string類別
- getline(cin,str)
- str.length()
- i\-\-
- str.clear()
- 將字串反轉後比較是否相等
- reverse(str.begin(),str.end()) 需含入 algorithm 標頭檔
```cpp=
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char** argv)
{
string s;
while(cin>>s)
{
string rev=s;
reverse( s.begin(), s.end() );
cout<<(s == rev ? "yes" : "no") <<endl;
}
return 0;
}
```
6. ### a130: 12015 - Google is Feeling Lucky
- 找最大值
- struct(結構)
- printf(),需含入 cstdio 標頭檔
```cpp=
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int main(int argc, char** argv)
{
int T,cnt=1;
struct rec
{
string name;
int v;
}web[10];
cin>>T;
while(T--)
{
int mx=0;
for(int i=0; i<10; i++)
{
cin>>web[i].name>>web[i].v;
if(web[i].v>mx)
mx=web[i].v;
}
printf("Case #%d:\n",cnt++);
for(int i=0; i<10; i++)
{
if(web[i].v==mx)
cout<<web[i].name<<endl;
}
}
return 0;
}
```
<br />
## 六、CH6 函式
1. ### d171: 飛蛾撲火(二)
- 內建函式:log10、floor
- logN^M^ = M*logN
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,m;
while (cin >> n >> m) {
cout <<floor(m*log10(n)+ 1)<< endl;
}
return 0;
}
```
2. ### c039: 00100 - The 3n + 1 problem
- 自訂函式(先練習寫pow(n,m))
- 內建函式:swap、max、min
```cpp=
#include <iostream>
#include <cstdio>
using namespace std;
int func(int n)
{
int i=1;
while (n!=1)
{
if (n%2==1)
n=3*n+1;
else
n=n/2;
i++;
}
return i;
}
int main()
{
int a,b;
while(cin >> a >> b)
{
int ans=0;
for(int i=min(a,b);i<=max(a,b);i++)
ans=max(ans,func(i));
//cout <<a<<" "<<b<<" "<<ans<<endl;
printf("%d %d %d\n",a,b,ans);
}
return 0;
}
```
3. ### a215: 明明愛數數
- do_while迴圈
```cpp=
#include <iostream>
using namespace std;
int main()
{
int n,m;
while(cin>> n >> m)
{
int count=0,sum=0;
do
{
sum+=n;
count++;
n++;
}
while(sum<=m);
cout<< count << endl;
}
return 0;
}
```
4. ### b112: 5.高中運動會
- 多個數的最大公因數
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a,int b)
{
while(a!=0 && b!=0)
{
if(a>b)
a=a%b;
else
b=b%a;
}
if(a==0)
return b;
else
return a;
}
int main()
{
int n;
while(cin>>n)
{
int num[n];
for(int i=0;i<n;i++)
cin >> num[i];
for(int i=1;i<n;i++)
num[i]=gcd(num[i],num[i-1]);
cout << num[n-1] << endl;
}
return 0;
}
```
5. ### a216: 數數愛明明
- 遞迴(先印出費式數列)
- long long int
- TLE(遞迴求一般項)
```cpp=
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
long long int num[30001],num2[30001];
num[1]=1; num2[1]=1;
for(int i=2;i<30001;i++)
{
num[i]=i+num[i-1];
num2[i]=num[i]+num2[i-1];
}
int n;
while(cin>>n&& n!='EOF')
{
cout<<num[n]<<" "<<num2[n]<<endl;
}
return 0;
}
```
6. ### a227: 三龍杯 -> 河內之塔
- [河內塔|樂和遊戲](http://www.novelgames.com/zh-HK/tower/)
- [河內塔程式參考](http://notepad.yehyeh.net/Content/DS/CH02/4.php)
```cpp=
#include <iostream>
#include <cstdio>
using namespace std;
void tower(int N,char a,char b,char c)
{
if(N>0)
{
tower(N-1,a,c,b);
printf("Move ring %d from %c to %c\n",N,a,c);
tower(N-1,b,a,c);
}
}
int main()
{
int N;
ios::sync_with_stdio(false);
cin.tie(0);
while (cin>>N)
{
tower(N,'A','B','C');
}
}
```