题目链接

输入t对数 a, b 

求(b,a]内的每个数拆成素因子的个数和

这里每个数都可以写成素数的乘积,可以写成几个素数的和就有几个素因子,这里求的是(b,a]内的素因子和

思路:

素数的素因子个数是1

对于非素数A的素因子个数 = A/k  + 1 其中k是素数,也是第一个素数,或者K是比A小的数,并且A%k==0

 

下面是利用K是比A小的数,并且A%k==0

 1     void solve(){
 2         Scanner sc = new Scanner(System.in);
 3         int t = sc.nextInt();
 4         int a ,b;
 5         int MAX = 5000000;
 6         int[] arr=new int[MAX+1];
 7         for(int i=2;i<=MAX;i++){
 8             if(i%2==0){
 9                 arr[i] = arr[i/2]+1;
10                 continue;
11             }
12             for(int j=3;j*j<=i;j+=2){
13                 int k=i/j;
14                 if(k*j==i){
15                     arr[i] = arr[k] + 1;
16                     break;
17                 }
18             }
19             if (arr[i]==0)
20                 arr[i] = 1;
21         }
22         for(int i=2;i<=MAX;i++)
23             arr[i]+=arr[i-1];
24         while(t!=0){        
25         a = sc.nextInt();
26         b = sc.nextInt();
27         System.out.println(arr[a]-arr[b]);
28         t--;
29         }
30     }
View Code

相关文章: