1.辗转相除法
思路:
求a和b的余数r ,若余数为0则b为最小公倍数;若余数不为0,则令a=b、b=r继续前面的过程:
#include<iostream>
using namespace std;
int main()
{
int a,b,com,r=1; //a,b为输入的数,r为余数,com为最小公倍数
cout<<"输入两个数:";
cin>>a>>b;
while(r)
{
r=a%b;
a=b;
b=r;
}
com=a;
cout<<"最小公倍数是:"<<com;
}
2.相减法
令大数减小数,并将差赋值给大数,直到两个数相等:
#include<iostream>
using namespace std;
int main()
{
int a,b,com,m=1; //m为差
cout<<"输入两个数:";
cin>>a>>b;
while(m)
{
m=a-b;
m>0?a=m:b=-m;
}
com=a;
cout<<"最小公倍数是:"<<com;
}
3.穷举法
取ab两个数的最小数作为标准,计算其是否能被两个数同时整除。如果不能,则减小1继续计算,直到符合条件。
#include<iostream>
using namespace std;
int main()
{
int a,b,com,min=0,ra=1,rb=0; //a,b为输入的数,min为a,b的最小值,ra,rb为a,b被min除所得的余数
cout<<"输入两个数:";
cin>>a>>b;
min=(a-b)>0?b:a;
while(ra+rb)
{
ra=a%min;
rb=b%min;
min--;
}
com=min+1;
cout<<"最小公倍数是:"<<com;
}
4.高精度计时器
这里提供一种计算代码运行用时的方法,相比于VS本身的库,利用Windows提供的APIA——QueryPerformanceCounter可以将时间精确到微秒级。其具体思路就是:
调用windows.h库函数,利用QueryPerformanceCounter分别记录程序的起始时间和终止时间,利用QueryPerformanceFrequency记录CPU的频率。则最后得到的时间间隔=(终止时间-起始时间)/CPU频率[此时单位为秒]。
这里对于前面三张方法分别进行了测算,本人亲测三种方法的用时相差不大。当然重点是熟悉这种程序检测方法。代码分别如下:
#include<iostream>
#include <windows.h>
using namespace std;
int main()
{
int a,b,com,r=1; //a,b为输入的数,r为余数,com为最小公倍数
double term; //定义用时
LARGE_INTEGER start,finish,cpu; //定义三个LARGE_INTEGER变量,分别代表开始时间、结束时间和cpu频率
cout<<"输入两个数:";
cin>>a>>b;
QueryPerformanceCounter(&start); //获取开始时间
QueryPerformanceFrequency(&cpu); //获取cpu频率
while(r)
{
r=a%b;
a=b;
b=r;
}
com=a;
cout<<"最小公倍数是:"<<com<<"\n";
QueryPerformanceCounter(&finish); //获取结束时间
term = (((double)finish.QuadPart - (double)start.QuadPart)/(double)cpu.QuadPart)*1e3; //计算用时(毫秒)
cout<<term;
}
#include<iostream>
#include <windows.h>
using namespace std;
int main()
{
int a,b,com,m=1; //m为差
double term;
LARGE_INTEGER start,finish,cpu; //定义三个LARGE_INTEGER变量,分别代表开始时间、结束时间和cpu频率
cout<<"输入两个数:";
cin>>a>>b;
QueryPerformanceCounter(&start); //获取开始时间
QueryPerformanceFrequency(&cpu); //获取cpu频率
while(m)
{
m=a-b;
m>0?a=m:b=-m;
}
com=a;
cout<<"最小公倍数是:"<<com<<"\n";
QueryPerformanceCounter(&finish); //获取结束时间
term = (((double)finish.QuadPart - (double)start.QuadPart)/(double)cpu.QuadPart)*1e3; //计算用时(毫秒)
cout<<term;
}
#include<iostream>
#include <windows.h>
using namespace std;
int main()
{
int a,b,com,min=0,ra=1,rb=0;
double term;
LARGE_INTEGER start,finish,cpu;
cout<<"输入两个数:";
cin>>a>>b;
QueryPerformanceCounter(&start);
QueryPerformanceFrequency(&cpu);
min=(a-b)>0?b:a;
while(ra+rb)
{
ra=a%min;
rb=b%min;
min--;
}
com=min+1;
cout<<"最小公倍数是:"<<com<<"\n";
QueryPerformanceCounter(&finish);
term = (((double)finish.QuadPart - (double)start.QuadPart)/(double)cpu.QuadPart)*1e3;
cout<<term;
}
如有错误,恳请指正~