* ACM 有用的練習題整理 (一)

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章