编程题集 (一)
編程題集 (一)
- 一個正整數序列,要求你把這個序列去重后按從小到大排序
- 輸入兩個數輸出它們的最大公約數和最小公倍數
一個正整數序列,要求你把這個序列去重后按從小到大排序
題目: 一個正整數序列,要求你把這個序列去重后按從小到大排序 第一行包含一個正整數n,表示老師給出的序列有n個數。接下來有n行, 每行一個正整數k,為序列中每一個元素的值。(1 ≤ n ≤ 10^5,1 ≤ k ≤ n)例: 5 3 3 4 1 2 結果: 1 2 3 4 題目分析: 給你一個序列 讓你去重 之后 由小到大 排序 題目給的數的個數最大范圍 是 10^5 說明我們的時間復雜度要低才能 在程序運行時不超時代碼如下
#include <stdio.h> int main(void) {int i, n, value;int a[100001]={0};scanf("%d", &n);while(scanf("%d", &value) != EOF) //while語句也可以用 for(i=0;i<n;i++){ {scanf("%d", &value);a[value] = value; a[value] = value;} }for(i = 1; i < n + 1; i++){if(a[i]){printf("%d ",a[i]);}}return 0; } // 有個技巧就是 下標和值是一樣的輸入兩個數輸出它們的最大公約數和最小公倍數
題目: 輸入兩個數輸出它們的最大公約數和最小公倍數 例: 20 30 輸出 10 60 最大公約數概念: 最大公因數,也稱最大公約數、最大公因子,指兩個或多個整數共有約數中最大的一個。 例: 20 和 30 都有的最大公因子是 10 最小公倍數概念: 兩個或多個整數公有的倍數叫做它們的公倍數,其中除0以外最小的一個公倍數就叫做這幾個整數的最小公倍數。 例: 20 和 30 最小公倍數是 60下面分析 最大公約數和最小公倍數 之間的關系 20=10*2 30=10*3 分析: (2*10*10*3) 一定是公倍數 20中有10 30中也有10 而10是20和30的最大公約數 所以最小公倍數為 2*10*3=60 綜上分析: 最小公倍數=(數1*數2)/它們的最大公約數代碼實現
#include<stdio.h> int main(void) {int a,b;int m,n;//m存放最大公約數n存放最小公共倍數int i=0;scanf("%d %d",&a,&b);if(a>=b){for(i=b;i>=1;i--){if( (a%i==0)&&(b%i==0) ){break;}}}else{for(i=a;i>=1;i--){if( (a%i==0)&&(b%i==0) ){break;}}}m=i;//最大公約數n=a*b/m;//最小公倍數printf("%d %d\n",m,n);return 0; } // 思路: 看兩個數哪個小,最大公約數一定小于等于那個小的數。 讓兩個數分別對那個小的數取余 當兩個余數都為零時就找到了,如果不滿足,讓最小的數減1接著找。 //用輾轉相除法實現 它的時間復雜度比上面那一種低 #include<stdio.h> int main(void) {int a,b;int m,n;//m存放最大公約數n存放最小公共倍數int temp=0;int i=0;scanf("%d %d",&a,&b);n=a*b;if(a>=b){temp=a%b;while(temp){a=b;b=temp;temp=a%b;}m=b;//最大公約數}else{temp=b%a;while(temp){b=a;a=temp;temp=b%a;}m=a;//最大公約數}n=n/m;//最小公倍數printf("%d %d\n",m,n);return 0; }總結
- 上一篇: 【OJ】OJ的介绍和常用OJ推荐
- 下一篇: C语言易错题集 第四部