题目解析
题意
输入整数n,输出n和最小公倍数(lcm)为n的所有组合数目。输入的n为0时,程序结束。
思路
组合中的两个数都是n的因数,暴力枚举n的因数,符合a*b==lcm(a,b)*gcd(a,b)条件的组合数的和即为所求。
简单说vector是一个存放任意类型的动态数组
vector<数据类型> a 和 数据类型 a[]的区别
系统在处理不定长时,向量比数组要快
代码
#include<stdio.h>
#include<vector>
#include<math.h>
using namespace std;
int gcd(int a,int b){//求a和b的最大公约数
return b==0?a:gcd(b,a%b);
}
int main(){
int n;
vector<int>a;//创建vector对象
while(~scanf("%d",&n),n){
int ans=0;
a.clear();//清空向量a中的元素
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){//求n的因数
if(i*i==n)
a.push_back(i);//在a的尾部插入值i
else{
a.push_back(i);
a.push_back(n/i);
}
}
}
for(int i=0;i<a.size();i++)
for(int j=i;j<a.size();j++)//a.size()为向量a的大小
if(a[i]*a[j]==n*gcd(a[i],a[j]))
ans++;
printf("%d %d\n",n,ans);
}
return 0;
}