1.代码清晰,简单,易懂 链接:https://www.nowcoder.com/questionTerminal/04c8a5ea209d41798d23b59f053fa4d6 来源:牛客网 #include using namespace std; int numOfDivisor(int num) { int ans = 0; int i; if(num==1)//原代码当num=1时会出现错误,这里是我自己修改的 { ans=1; return; } for (i = 1; i*i<num; i++)//和i<sqrt(num)原理相同 { if (num%i == 0) ans += 2;//因为能整除,所以有两个因数,另外一个肯定大于i } if (i*i == num) ans++;//如,16=4*4,前面i的范围是1-3,i=4时跳出了循环,所以后面要再判断如果4*4=16了,约数个数再加1 return ans; } int main() { int n, num; while (cin >> n) { for (int i = 0; i<n; i++) { cin >> num; cout << numOfDivisor(num) << endl; } } return 0; }
2.复杂的质因数的分解法,如24=2^3*3,所以它的约数个数为(3+1)*(1+1)=8
#include<iostream>//修改后的版本,防止内存溢出 #include<cmath> using namespace std; unsigned int a[1000]; int sum[1000]; int j,sum1; void init() { for (int i = 0; i < 1000; i++) { a[i] =sum[i]= 0; } } void set(int x) { init(); for (int i = 0; i < x; i++) cin >> a[i]; } void getprimecnt(int x) { int cout ; for (int i = 0; i < x; i++) { cout = 0; sum1 = 1; if (a[i] == 1)//同样对1单独输出 { sum[i] = sum1; continue; } int k =(int)sqrt(a[i])+1; for (j = 2; j < k; j++)//质因数分解 { cout = 0; while (a[i] % j == 0) { cout++;//质因数的指数 a[i] /= j; } sum1 *= (cout+1);//指数的乘积 if(a[i]==1) break; } if (a[i] != 1)//如果通过了前面质因数的分解后,num还没分解为1,说明num本身是一个质数,经历上面的分解过程没有改变num的值,因为分解范围是2-sqrt(num), sum1*= 2;//所以他的因数是1和它本身,为2; sum[i] = sum1; } } void output(int x) { for (int i = 0; i < x; i++) { cout << sum[i] << endl; } } int main() { int n; while (cin >> n) { set(n); getprimecnt(n); output(n); } return 0; }