#include<iostream>
using namespace std;
//辗转相除法(欧几里得法)
int gcd(int a, int b){//函数功能确定:求最大公约数
while(a%b!=0){
int r=a%b;
a=b;
b=r;
}
return b;
}
int lcm(int a, int b){//函数功能确定:求最小公倍数
return (a*b)/gcd(a,b);
}
int main(){
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;//输出最大公约数
cout<<lcm(a,b);//输出最小公倍数
return 0;
}
分解质因数
#include<iostream>
using namespace std;
int main(){//需求:将合数分解质因数并输出为 ?=?*?*?*? 的形式
int a,cs=2,flag=0;
cin>>a;
cout<<a<<"=";//输出算式前半部分
while(a!=1){//只要a没有被除到1,就一直分解质因数
if(a%cs==0){//判断当前a是否能够被除数cs整除
if(flag==0){//通过flag判断是否是首次输出的质因数
cout<<cs;//首次输出的质因数前面不带*
flag=1;//改变状态
}
else{
cout<<"*"<<cs;//非首次的质因数前面带星号
}
a=a/cs;//将a更新为除以cs后的结果
}
else{
cs++;//当前a不能被cs整除,则cs自增1
}
}
return 0;
}
直接插入排序
#include<iostream>
using namespace std;
int main(){//需求:通过直接插入排序对n(1<n<1000)个数的序列进行从小到大排序
int a[1005],n;
cin>>n;
for(int i=1; i<=n; ++i){//数组循环输入
cin>>a[i];
}
for(int i=2; i<=n; ++i){//遍历待插入数字
int k=a[i],j;//将当前待插入数字存入k,并将j设为外层循环局部变量
for(j=i-1; j>=1&&k<a[j]; --j){//从后向前遍历有序数列
a[j+1]=a[j];//大的数字后移一位
}
a[j+1]=k;//将待插入数字存入最后后移的元素位置
}
for(int i=1; i<=n; ++i){//数组循环输出
cout<<a[i]<<" ";
}
return 0;
}
二分查找
#include<iostream>
using namespace std;
int find(int a[], int n, int k){//函数功能确定:找到返回下标,否则返回-1
int l=1, r=n, mid;
while(l<=r){
mid=(l+r)/2;//每次查找更新mid下标值
if(a[mid]>k){//如果中间数据比k大则更新上限
r=mid-1;
}
else if(a[mid]<k){//如果中间数据比k小则更新下限
l=mid+1;
}
else{//找到了返回下标
return mid;
}
}
return -1;//找不到返回-1
}
int main(){//需求:在长度为n(1<n<1000)的序列中查找一定存在的数字k
int n,a[1005],k;
cin>>n;
for(int i=1; i<=n; ++i){//从1开始输入数据
cin>>a[i];
}
cin>>k;//待查找数据
cout<<find(a,n,k);//输出数据的下标
return 0;
}