1. 程式人生 > >《演算法筆記》2.5小節

《演算法筆記》2.5小節

有點撈啊...題簡單的話更應該寫的優雅一點才對...QAQ

我這麼懶得動腦  真的會有進步嗎...檢討一下...

問題 A: 習題6-4 有序插入

題目描述

有一個已排好序的陣列,要求輸入一個數後,按原來排序的規律將它插入到陣列中。

假設陣列長度為10,陣列中前9個數(這9個數要求從鍵盤上輸入,輸入時要滿足自小到大的輸入順序)已經按從小到大進行排序。

然後再從鍵盤上輸入一個整數,將此整數插入到前有序的9個數中,使得最終的10個數依然是從小到大有序的。

輸入

第一行輸入以空格分隔的9個整數數,要求按從小到大的順序輸入。

第二行輸入一個整數

輸出

從小到大輸出這10個數,每個數一行。

樣例輸入

1 11 21 31 41 51 61 71 81
45

樣例輸出

1
11
21
31
41
45
51
61
71
81

提示

定義陣列時,把陣列長度定義為10.

#include<iostream>
using namespace std;
int main(){
	int a[10]={0};
	for(int i=0;i<=9;i++)
	cin>>a[i];
	
	for(int k=0;k<=8;k++)
	{
		int temp;
		if(a[9]<a[k])
		{
		temp=a[9];
		a[9]=a[k];
		a[k]=temp; 
		}	
	}
	
    for(int j=0;j<=9;j++)
	cout<<a[j]<<endl;

	return 0;
}

emm 效率有點低...哈哈

問題 B: 習題6-5 陣列元素逆置

題目描述

將一個長度為10的整型陣列中的值按逆序重新存放。

如:原來的順序為1,2,3,4,5,6,7,8,9,0,要求改為0,9,8,7,6,5,4,3,2,1

輸入

從鍵盤上輸入以空格分隔的10個整數。

輸出

按相反的順序輸出這10個數,每個數佔一行。

樣例輸入

1 2 3 4 5 6 7 8 9 0

樣例輸出

0
9
8
7
6
5
4
3
2
1
#include<iostream>
using namespace std;
int main(){
	int a[10]={0};
	for(int i=0;i<=9;i++)
	cin>>a[i];
	

	
    for(int j=9;j>=0;j--)
	cout<<a[j]<<endl;

	return 0;
}

問題 C: 習題6-6 楊輝三角

題目描述

按要求輸入如下格式的楊輝三角

1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1

最多輸出10層

輸入

輸入只包含一個正整數n,表示將要輸出的楊輝三角的層數。

輸出

對應於該輸入,請輸出相應層數的楊輝三角,每一層的整數之間用一個空格隔開

樣例輸入

5

樣例輸出

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
#include<iostream>
using namespace std;
int main(){
	int a[10][10]={0};
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		a[i][0]=1;
		a[i][i]=1;
		
	}
	
	
    for(int i=0;i<n;i++)
    	{
    		for(int j=0;j<=i;j++)
			{
				if(a[i][j]!=1)
				a[i][j]=a[i-1][j-1]+a[i-1][j];
				cout<<a[i][j]<<" ";
				
			}
			cout<<endl;

		}

	return 0;
}

問題 D: 習題6-12 解密

題目描述

有一行電文,已按如下規律譯成密碼:

A-->Z        a-->z

B-->Y        b-->y

C-->X        c-->x

......          ......

即第一個字母變成第26個字母,第i個字母變成第(26-i+1)個字母,非字母字元不變。要求根據密碼譯回原文,並輸出。

輸入

輸入一行密文

輸出

解密後的原文,單獨佔一行。

樣例輸入

ZYX123zyx

樣例輸出

ABC123abc
#include <iostream>
using namespace std;


main ()
{
char a[100];
cin>>a;


for(int i=0;i<100;i++)
{

	if(a[i]>='A'&&a[i]<='Z')
	a[i]='A'+'Z'-a[i];
	if(a[i]>='a'&&a[i]<='z')
	a[i]='a'+'z'-a[i];
	if(a[i]=='\0')
	break;
}
cout<<a<<endl;

 
return 0; 
}

問題 E: 習題6-13 字串比較

題目描述

比較兩個字串s1和s2的大小,如果s1>s2,則輸出一個正數;若s1=s2,則輸出0;若s1<s2,則輸出一個負數。

要求:不用strcpy函式;兩個字串用gets函式讀入。

例如:"A"與"C"相比,由於"A"<"C",應輸出負數,同時由於"A"與"C"的ASCII碼差值為2,因此應輸出"-2"。

同理:"And"和"Aid"比較,根據第2個字元比較的結果,"n"比"i"大5,因此應該輸出"5"

輸入

輸入2行字串

輸出

一個整數,表示這兩個字串 比較的差值,單獨佔一行。

樣例輸入

And
Aid

樣例輸出

5
#include <iostream>
#include<cstdio>
using namespace std;


main ()
{
char s1[100],s2[100];
int i,n=0;
gets(s1);
gets(s2);


for(i=0;s1[i]!='\0'&&s2[i]!='\0';i++)
if(s1[i]!=s2[i])
{
	n=s1[i]-s2[i];
	break;
}


cout<<n<<endl; 
return 0; 
}

問題 F: 例題6-1 逆序輸出陣列元素

題目描述

從鍵盤上輸入10個整數,儲存在一個長度為10的整型陣列中,要求將輸入的10個數逆序輸出。

如輸入為:0,1,2,3,4,5,6,7,8,9 輸出為9,8,7,6,5,4,3,2,1,0

輸入

10個整數,以空格分隔

輸出

將輸入的10個整數逆序輸出,每個數佔一行。

樣例輸入

0 1 2 3 4 5 6 7 8 9

樣例輸出

9
8
7
6
5
4
3
2
1
0

emmm 這個按照系統的意思應該和B是同一題....為毛我讀下來覺得是排個序然後倒序輸出???

問題 G: 例題6-2 陣列求解Fibonacci數列問題

題目描述

Fibonacci數列的特點:第1,2個數為1,1。從第3個數開始,概述是前面兩個數之和。即: 

要求輸出Fibonacci數列的前20個數。

輸入

輸出

Fibonacci數列的前20個數,每個數佔一行。

樣例輸入

樣例輸出

1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
#include<iostream>
using namespace std;
int main(){
	int a[20]={1,1};
	for(int i=2;i<20;i++)
	a[i]=a[i-1]+a[i-2];

	
    for(int j=0;j<20;j++)
	cout<<a[j]<<endl;

	return 0;
}

問題 H: 例題6-3 氣泡排序

題目描述

從鍵盤上輸入10個整數,用冒泡法對這10個數進行排序(由小到大)。

輸入

以空格分隔的10個整數

輸出

依次輸出排好序的10個整數,每個數佔一行。

樣例輸入

1 3 5 7 9 2 4 6 8 0

樣例輸出

0
1
2
3
4
5
6
7
8
9
#include<iostream>
using namespace std;
int main(){
	int a[10];
	for(int i=0;i<10;i++)
	cin>>a[i];
	
	for(int k=9;k>0;k--)
		for(int r=0;r<k;r++)
			{
				if(a[r]>a[r+1])
				{
					int temp;
					temp=a[r];
					a[r]=a[r+1];
					a[r+1]=temp;
					
				}
			}
			
		
	
    for(int j=0;j<10;j++)
	cout<<a[j]<<endl;

	return 0;
}

問題 I: 例題6-4 矩陣轉置

題目描述

將一個2行3列的矩陣(二維陣列)行列互換,儲存到另一個3行2列的矩陣中。

要求以整型資料為例來解答。

輸入

輸入2行資料,每行3個整數,以空格分隔。

輸出

行列互換後的矩陣,3行,每行2個數據,以空格分隔。

樣例輸入

1 2 3
4 5 6

樣例輸出

1 4
2 5
3 6
#include<iostream>
using namespace std;

int main()
{
	int a[2][3];
	int b[3][2];
	
	for(int i=0;i<2;i++)
		for(int j=0;j<3;j++)
			{
				cin>>a[i][j];
				b[j][i]=a[i][j];
			}
	
	for(int i=0;i<3;i++)
		{
			for(int j=0;j<2;j++)
			cout<<b[i][j]<<" ";
			cout<<endl;
		}
	
	
}

問題 J: 例題6-9 字串求最大值

題目描述

從鍵盤上輸入3個字串,求出其中最大者。

輸入

輸入3行,每行均為一個字串。

輸出

一行,輸入三個字串中最大者。

樣例輸入

England
China
America

樣例輸出

England
#include<iostream>
#include<cstring>
using namespace std;

int main()
{
	char a[100],b[100],c[100],max[100];
	
	cin>>a>>b>>c;
	
	if(strcmp(b,c)>0)
		strcpy(max,b);
	else 
		strcpy(max,c);
	
	if(strcmp(a,max)>0)
		strcpy(max,a);
	
	cout<<max<<endl;
	
}