⭐每日算法题解系列文章旨在精选重点与易错的算法题,总结常见的算法思路与可能出现的错误,与笔者另一系列文章有所区别,并不是以知识点的形式提升算法能力,而是以实战习题的形式理解算法,使用算法。
🔥本文已收录于算法刷题系列专栏: 每日算法题解 欢迎订阅,持续更新。
33.最大公约数
输入两个整数 a 和 b,请你编写一个函数,int gcd(int a, int b), 计算并输出 a 和 b 的最大公约数。
输入格式
共一行,包含两个整数 a 和 b。
输出格式
共一行,包含一个整数,表示 a 和 b 的最大公约数。
数据范围
1≤a,b≤1000
输入样例:
输出样例:
思路
常见思路:利用循环求解
#include<bits/stdc++.h>using namespace std;
int gcd(int a, int b){ for(int i = min(a,b);i >=1;i--) { if(b%i==0 && a%i == 0)return i; }}
int main(){ int a,b; cin>>a>>b; cout<< gcd(a,b)<<endl; return 0; }
复制代码
此外可以采用欧几里得算法解决(辗转相除法)
part2 辗转相除法(欧几里得算法)前置定理:gcd(a,b)=gcd(b,amodb)![]()
可以一直将 gcd(a,b)转化为 gcd(x,0),此时 x 为 gcd(a,b)。
代码:
while (b) {
int tmp = a % b; a = b; b = tmp;
}
复制代码
时间复杂度 O(log2(a+b))。
34.数组去重
给定一个长度为 n 的数组 a,请你编写一个函数:
int get_unique_count(int a[], int n); // 返回数组前n个数中的不同数的个数
复制代码
输入格式
第一行包含一个整数 n。
第二行包含 n 个整数,表示数组 a。
输出格式
共一行,包含一个整数表示数组中不同数的个数。
数据范围
1≤n≤1000,1≤ai≤1000。
输入样例:
输出样例:
思路
第一种思路:
采取分别对每个数字出现的次数计数,最后再统计出现次数不为 0 的个数。
#include<bits/stdc++.h>using namespace std;
int get_unique_count(int a[],int n){ int cnt[1001] = {0},tot = 0; for(int i = 0 ; i < n; i++) { for(int j = 0; j <= 1000; j++){ if(a[i] == j )cnt[a[i]]++;} } for(int i = 0; i <= 1000; i++) if(cnt[i] != 0)tot++; cout<< tot<<endl;}
int main(){ int n,a[1001]; cin >> n; for(int i = 0; i < n; i++)cin >> a[i]; get_unique_count(a , n); return 0;}
复制代码
第二种思路:
采取判断该数之前是否出现过。用 bool 做标记。
#include<bits/stdc++.h>using namespace std;
int get_unique_count(int a[],int n){ int cnt = 0; for(int i = 0; i < n; i++) {//本次要比较的数 bool occurred = false; for(int j = 0; j < i; j++) {//前面所有的数 if(a[i] == a[j]) { occurred = true; break; } } if(occurred == false)cnt ++; } return cnt;}
int main(){ int n,a[1001]; cin >> n; for(int i = 0; i < n; i++)cin >> a[i]; cout << get_unique_count(a , n); return 0;}
复制代码
第三种思路:
先对数组进行排序,这时会把数字相同的排序在一起,再使用双指针方法去重,最后统计前一个指针的数目即可。
#include<bits/stdc++.h>using namespace std;
int get_unique_count(int a[],int n){ int k = 1;//第一个指针 for(int j = 1; j < n ; j++) {//第二个指针 if(a[j] != a[k-1]) a[k++] = a[j];//如果不相等,标记一下 } return k; }
int main(){ int n,a[1001]; cin >> n; for(int i = 0; i < n; i++)cin >> a[i]; sort(a, a+n);//注意需要提前由小到大排序好 cout << get_unique_count(a , n); return 0;}
复制代码
sort 自定义排序函数
1.sort 简介
(1)用于 C++中,对给定区间所有元素进行排序;
(2)使用的排序方法是类似于快排的方法,时间复杂度为 n*log2(n),执行效率较高;
(3)头文件 #include <algorithm>。
2.使用方法
sort 函数有三个参数
sort(first,last,cmp);
其中,first 是元素的起始地址,last 是结束地址,cmp 是排序的方式。对**[first,last)(一定要注意这里的区间是左闭又开)**区间内数据根据 cmp 的方式进行排序。也可以不写第三个参数,此时按默认排序,从小到大进行排序。
评论