九度 1493 公约数
题目描述:
给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。
思路
1. 编程之美上给出了求解最大公约数的正规解法
2. 求出最大公约数后, 然后就不知道怎么做了. 上网查了资料, 才发现对最大公约数进行质因数分解就能得出所有的公约数的组合
3. 质因数分解的话, 使用 map 存储 key-value 比较合适
代码
#include <stdio.h> #include <map> #include <iostream> using namespace std; int gcd(int x, int y) { if(x == 1 || y == 1) return 1; if(x == y) return x; if(y > x) swap(x,y); if((x&1) && (y&1)) { return gcd(x-y, y); }else if((x&1) &&(!(y&1))) { return gcd(x, y/2); }else if ((!(x&1)) && (y&1)) { return gcd(x/2, y); }else{ return 2*gcd(x/2, y/2); } } int num(int n) { map<int, int> record; for(int i = 2; i <= n && n != 1; i ++) { while(n >= i && n % i == 0) { record[i] ++; n /= i; } } int res = 1; map<int, int>::iterator it_map; for(it_map = record.begin(); it_map != record.end(); it_map ++) { res *= (it_map->second+1); } return res; } int main() { //freopen("testcase.txt", "r", stdin); int a, b; while(scanf("%d%d", &a, &b) != EOF) { int maxgcd = gcd(a,b); cout << num(maxgcd) << endl; } return 0; }