【九度OJ】题目1087:约数的个数
1.约数个数定理:对于一个数a可以分解质因数:a=a1的r1次方乘以a2的r2次方乘以a3的r3次方乘以……
则a的约数的个数就是(r1+1)(r2+1)(r3+1)……
需要指出来的是,a1,a2,a3……都是a的质因数。r1,r2,r3……是a1,a2,a3……的指数。
2.判断m的约数个数:将m开方得n,判断n之前属于m的约数个数num。若n为整数,则m约数个数为2*num+1,否则为2*num
原题:
题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1000) 接下来的1行包括N个整数,其中每个数的范围为(1<=Num<=1000000000) 当N=0时输入结束。 输出: 可能有多组输入数据,对于每组输入数据, 输出N行,其中每一行对应上面的一个数的约数的个数。 样例输入: 5 1 3 4 6 12 样例输出: 1 2 3 4 6
解题代码:
C语言:
#include<stdio.h> #include<math.h> int main() { int n,i,a; while(scanf("%d",&n)!=EOF && n!=0) { for(i=0; i<n; i++) { scanf("%d",&a); printf("%d\n",fun(a)); } } return 0; } int fun(int n) { int i; int num=0; int a = sqrt(n); for(i=1; i<= a; i++) { if(n%i==0) num=num+2; } if(a*a==n) num--; return num; }
Java语言:Runtime Error 原因还未发现,请看了的此文的帮帮忙,谢谢!
package NineOJ; import java.util.Scanner; public class Oj1087 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n; while (scanner.hasNext()) { n = scanner.nextInt(); if (n == 0) { break; } while (n-- > 0) { fun(scanner.nextInt()); } } } private static void fun(int m) {// 求约数个数的方法 int sum = 0; int root = (int) Math.sqrt(m);// 先求出平方根 for (int i = 1; i <= root; i++) { if (m % i == 0) { sum = sum + 2; } } if (root * root == m) {// 如果整数root正好是sum的平方根的话,前面就多算了一次 sum = sum - 1; } System.out.println(sum); } }