1、ASCII碼排序 問題
輸入三個字符(可以重複)後,按各字符的ASCII碼從小到大的順序輸出這三個字符。
* 注意: 必須要把char 轉換爲 int 才能進行比較
2、奇偶數分離
有一個整型偶數n(2<= n <=10000),你要做的是:先把1到n中的所有奇數從小到大輸出,再把所有的偶數從小到大輸出。
*注意:分離奇偶數簡單方法 for(int i=1; i<=n; i+=2) 和 for(int i=2; i<=n; i+=2)
3、A Famous Music Composer
有12個唯一的音符,有10個是重名的音符。
A A#=Bb B C C#=Db D D#=Eb E F F#=Gb G G#=Ab
樣例輸入Ab minor D# major G minor樣例輸出
Case 1: G# minor Case 2: Eb major Case 3: UNIQUE
* 學習這種什麼情況下放在二維數組裏
#include<iostream>
#include<string>
int main()
{
std::string a[5][2] = {{"A#","Bb"},{"C#","Db"},{"D#","Eb"},{"F#","Gb"},{"G#","Ab"}};
std::string name, ton;
int count = 0;
while(std::cin>>name)
{
std::cin>>ton;
++count;
bool isalt = false;
for(int i=0; i<5; ++i)
{
for(int k=0; k<2; ++k)
{
if(name == a[i][k])
{
if(k==0)
name = a[i][1];
if(k==1)
name = a[i][0];
isalt = true;
break;
}
}
if(isalt)
break;
}
if(isalt)
std::cout<<"Case"<<count<<": "<<name<<" "<<ton<<std::endl;
else
std::cout<<"Case"<<count<<": "<<"UNIQUE"<<std::endl;
}
return 0;
}
4、蛇形填數
在n*n矩陣裏填入1,2,...,n*n,要求填成蛇形。例如n=4時矩陣爲:10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4
- 輸入
- 直接輸入矩陣的維數,即n的值。(n<=100)
- 輸出
- 輸出結果是蛇形矩陣
- * 算法核心四個方向,下,左,上,右。注意 while(i<n-1 && !a[i+1][j]) 這個地方比較難。
#include <iostream>
#define MAX 100
int a[MAX][MAX];
int main()
{
int i, j, n, m;
m = 0;
memset(a, 0, sizeof(a));
std::cin>>n;
i=0;j=n-1;
a[i][j] = m = 1;
while (m<n*n)
{
while(i<n-1 && !a[i+1][j])
a[++i][j] = ++m;
while(j>=1 && !a[i][j-1])
a[i][--j] = ++m;
while(i>=1 && !a[i-1][j])
a[--i][j] = ++m;
while(j<n-1 && !a[i][j+1])
a[i][++j] = ++m;
}
for(int x=0; x<n; ++x)
{
for(int y=0; y<n; ++y)
{
std::cout<<a[x][y]<<' ';
}
std::cout<<std::endl;
}
return 0;
}
5、韓信點兵
相傳韓信才智過人,從不直接清點自己軍隊的人數,只要讓士兵先後以三人一排、五人一排、七人一排地變換隊形,而他每次只掠一眼隊伍的排尾就知道總人數了。輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7),輸出總人數的最小值(或報告無解)。已知總人數不小於10,不超過100 。
輸入輸入3個非負整數a,b,c ,表示每種隊形排尾的人數(a<3,b<5,c<7)。輸出輸出總人數的最小值(或報告無解,即輸出No answer)。樣例輸入2 1 6樣例輸出
41
* 這種題都會有個核心算法,剛開始做這道題的時候看到網上有一種版本是
#include <iostream>
int main()
{
int a, b ,c,n;
std::cin>>a>>b>>c;
for(n=10; n<=100; ++n)
{
if(n%3==a && n%5==b && n%7==c)
{
std::cout<<n<<std::endl;
break;
}
if(n==100)
std::cout<<"No answer"<<std::endl;
}
return 0;
}
雖然結果是對的……但明顯不是韓信點兵了啊!尼瑪韓信要這樣算,還不如一個一個的數呢,畫蛇添足
正確的算法應該是:
3人一組時,5和7的倍數70 除3剛好餘1,
5人一組時,3*7=21除5又剛好餘1,
7人一組時,3*5=15除7還是餘1。
將這些數加起來減去105,直到得到數比105小爲止。取餘數是個超棒的選擇!!!
#include <iostream>
int main()
{
int a, b ,c, n;
std::cin>>a>>b>>c;
n = (a*70 + b*21 + c*15)%105;
if(n<10 && n>100)
std::cout<<"No answer"<<std::endl;
else
std::cout<<n<<std::endl;
return 0;
}
6、素數求和問題
現在給你N個數(0<N<1000),現在要求你寫出一個程序,找出這N個數中的所有素數,並求和。
輸入第一行給出整數M(0<M<10)代表多少組測試數據
每組測試數據第一行給你N,代表該組測試數據的數量。
接下來的N個數爲要測試的數據,每個數小於1000 輸出每組測試數據結果佔一行,輸出給出的測試數據的所有素數和 樣例輸入
3 5 1 2 3 4 5 8 11 12 13 14 15 16 17 18 10 21 22 23 24 25 26 27 28 29 30樣例輸出
10 41 52* 讀取一行的每一個數是靠的n
#include <iostream>
int f(int i)
{
for(int k=2; k<i; ++k)
{
if(i%k == 0)
return 0;
}
return 1;
}
int main()
{
int n,m,i,sum;
std::cin>>m;
while (m--)
{
sum = 0;
std::cin>>n;
while(n--)//一行輸入幾個數據,知道是具體幾個時
{
std::cin>>i;
if(f(i) && i!=1)
sum += i;
}
std::cout<<sum<<std::endl;
}
return 0;
}