總結一下所學的內容

YxrAhaha發表於2020-11-14


前言

從跨進三大到現在,也有兩個多月的時間了。時間真的過得挺快的,下週就會進行的C語言分流考試了,雖然仗著高中學習過一部分語言知識目前學習起來壓力不是很大,但是還是寫一篇部落格來總結一下一些基礎的知識點和演算法吧,也算是給這一段時間在工作室的學習來一個總結吧


提示:以下是本篇文章正文內容,下面案例可供參考

一、一些基礎的題目和程式碼實現

1、輸出所有的三位水仙花數

題目:請輸出所有的水仙花數
樣例輸入:無
樣例輸出:153,370,371,407

方法一:分離每個數的個位十位百位
程式碼實現:

#include <iostream>
#include <cmath> 
using namespace std;
int main(){
	double ans = 0;
	for(int i = 100;i<=999;i++){
		int temp=i;
		ans=0;
		for(int j = 1;j<=3;j++){
			ans=ans+pow(temp%10,3.0);
			temp/=10;
		}
		if(ans == i) cout<<ans<<" ";
	}
	return 0;
}


方法二:三重迴圈來暴力模擬一個數的個位十位百位
程式碼實現:

#include <iostream>
#include <cmath> 
using namespace std;
int main(){
	double ans = 0;
	for(int i = 1;i<=9;i++){
		for(int j = 0;j<=9;j++){
			for(int k = 0;k<=9;k++){
				int temp=i*100+j*10+k;
				if(temp == i*i*i+j*j*j+k*k*k)
					cout<<temp<<" ";
			}
		}
	}
	return 0;
}

2、氣泡排序和選擇排序

題目:請使用氣泡排序和選擇排序分別對a,b兩個陣列進行排序
樣例輸入:輸入n代表每個陣列有多少個數,之後的兩行,每行n個數,表示輸入的資料
5
1 3 2 5 4
2 1 8 7 6
樣例輸出:
1 2 3 4 5
1 2 6 7 8

程式碼實現:

//選擇排序和氣泡排序 
#include <iostream>
#define N 20
int a[N+1];
int b[N+1]; 
using namespace std;
void selectsort(int num1[],int n){
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=n;j++){
			if(num1[i] < num1[j]){   //以第一個數為基準數 內迴圈迴圈一次就可以將一個最大數放到尾部 
				swap(num1[i],num1[j]);
			}
		}
	}
}
void bubblesort(int num1[],int n){
	for(int i = 1;i<=n-1;i++){
		bool flag=false;      //標記每一輪是否有發生交換 
		for(int j = 1;j<=n-i;j++){
			if(num1[j] > num1[j+1]){
				flag=true;
				swap(num1[j],num1[j+1]);
			}
		}
		if(!flag) break;  //如果沒有發生交換 說明當前數列已經是有序的了  不再需要交換 
	}
} 
int main(){
	int n = 0;
	cin>>n;
	for(int i = 1;i<=n;i++)
		cin>>a[i];
	for(int i = 1;i<=n;i++)
		cin>>b[i];
	selectsort(b,n);
	bubblesort(a,n);
	cout<<"排序後的a陣列為:";
	for(int i = 1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	cout<<endl<<"排序後的b陣列為:";
	for(int i = 1;i<=n;i++){
		cout<<b[i]<<" "; 
	} 
} 

3、求解n以內的所有素數

樣例輸入:5
樣例輸出:2 3 5


順便記錄一下篩選素數的方法:
①從2開始一直判斷到n-1
②從2開始判斷到sqrt(n)
③埃氏篩法
④尤拉篩法(利用最小質因子優化埃氏篩法)
程式碼實現:

//求解 n以內的所有素數
#include <iostream>
#include <cmath>
#include <cstring>
#define N 10000000
bool book1[N+1];
bool book2[N+1];
int a1[N+1];
int a2[N+1];
using namespace std;
void prime1(int n){
	cout<<"不加任何優化的篩選:";
	for(int i = 2;i<=n;i++){
		bool flag=true;//預設為素數 
		for(int j = 2;j<i;j++){//從2篩選到i-1 
			if(i % j == 0){
				flag=false;
				break; 
			}
		}
		if(flag) cout<<i<<" ";
	}
}
void prime2(int n){
	cout<<"利用sqrt函式縮小篩選的範圍的篩法:" ;
	for(int i = 2;i<=n;i++){
		bool flag=true;//預設為素數 
		for(int j = 2;j<=sqrt(i);j++){//從2篩選到i-1 
			if(i % j == 0){
				flag=false;
				break; 
			}
		}
		if(flag) cout<<i<<" ";
	}
}
void prime3(int n){
	cout<<"埃氏篩素數法:";
	for(int i = 2;i<=n;i++){
		if(book1[i]){
			a1[i]=i;
			book1[i]=false;
			for(int j = 2*i;j<=n;j+=i){
				book1[j]=false;
			}
		}
	}
	for(int i = 2;i<=n;i++)
		if(a1[i]) cout<<a1[i]<<" ";
}
void prime4(int n){
	cout<<"尤拉篩法:";
	for(int i = 2;i<=n;i++){
		if(book2[i]){
			a2[i]=i;
			book2[i]=false;
			for(int j = 2*i;j<=n;j+=i){
				int k = 2;
				book2[j]=false;
				if(j % a2[k++] == 0) break;//尤拉篩法的核心思想
			}
		}
	}
	for(int i = 2;i<=n;i++)
		if(a2[i]) cout<<a2[i]<<" "; 
}
 
int main(){
	memset(book1,true,sizeof(book1));
	memset(book2,true,sizeof(book2));
	int n = 0;
	cin>>n;
	prime1(n);
	cout<<endl;
	prime2(n);
	cout<<endl;
	prime3(n);
	cout<<endl;
	prime4(n);
	cout<<endl;
} 

4、求最大公約數和最小公倍數

題目:給定兩個數m,n,求他們的最大公約數和最小公倍數
樣例輸入:3,9
樣例輸出:3,9

數學知識:最大公約數乘以最小公倍數等於兩個數的乘積
程式碼實現:

//求兩個數的最大公約數和最小公倍數 
//兩個數的乘積等於最大公約數乘以最小公倍數 
#include <iostream>
using namespace std;
int gongyue(int n,int m){
	int q;
	while(1){
		q=n%m;
		if(q == 0) return m;
		else{
			n=m;
			m=q;
		}
	} 
}
int gongbei(int n,int m){
	int temp=gongyue(n,m);
	int temp2=n*m;
	return temp2/temp;
} 
int main(){
	int n,m;
	cin>>n>>m;
	cout<<"最小公約數為:"<<gongyue(n,m)<<endl;
	cout<<"最大公倍數為:"<<gongbei(n,m)<<endl;
} 

5、對字串進行刪除所有指定字元的操作

題目:給定一段字串(可能包含空格)和一個字元,要求刪除這個字串中的所有給定的字元,如果該字串中不包含有此字元,輸出No Answer
樣例輸入:
love the world
o
樣例輸出:
lve the wrld

程式碼實現:

#include <iostream>
#include <cstring>
#include <cstdlib>
#define N 1000
char str[N+1];
bool book[N+1];
char word;
using namespace std;
int main(){
	memset(book,true,sizeof(book));
	int lenth = 0;
	cin.getline(str,2000);
	cin>>word;
	lenth=strlen(str);
	/*假刪除實現
	for(int i = 0;i<lenth;i++)
		if(word == str[i]) book[i]=false;
	for(int i = 0;i<lenth;i++){
		if(book[i]) cout<<str[i];
	}*/
	for(int i = 0;i<lenth;i++){
		if(str[i] == word){
			for(int j = i;j<lenth;j++)
				str[j]=str[j+1];
			lenth--;//避免訪問越界
		}
	}
	str[lenth]='\0';//字串末尾置結束符
	for(int i = 0;i<lenth;i++){
		cout<<str[i];
	}
	system("pause");
	return 0;
}

6、自定義函式交換兩個數的值

題目:給定兩個數m,n,編寫一個和swap有相同功能的函式
樣例輸入:5,3
樣例輸出:3,5

程式碼實現:

#include <iostream>
using namespace std;
void swap(int *m,int *n){
	int temp=*m;
	*m=*n;
	*n=temp;
	return;
} 
int main(){
	int m,n;
	cin>>m>>n;
	cout<<"交換前:"<<"m="<<m<<" "<<"n="<<n<<endl; 
	swap(&m,&n);
	cout<<"交換後:"<<"m="<<m<<" "<<"n="<<n<<endl;
	return 0; 
}

7、行指標的使用

題目:無
樣例輸入:無
樣例輸出:無

程式碼實現:

//行指標的使用
#include <iostream>
#define N 10
using namespace std;
int main(){
	int a[N+1][N+1];
	int n = 0;
	cin>>n;
	int (*p)[N+1];//行指標中每行的個數這個引數要和被指向的二維陣列的每行的元素個數相同   不然會報錯 
	for(int i = 1;i<=n;i++)
		for(int j = 1;j<=n;j++)
			cin>>a[i][j];
	p=a;
	for(int i = 1;i<=n;i++){
		for(int j = 1;j<=n;j++)
			cout<<*(*(p+i)+j)<<" ";
		cout<<endl;
	}
} 

知識點:使用行指標指向某個二維陣列的時候需要保證每一行的個數和二維陣列每一行的個數相同,不然定義行指標的時候會報錯

總結

提示:這裡對文章進行總結:
例如:

相關文章