1. 程式人生 > >【java練習】SDUT 2499 數字(思維+數論)

【java練習】SDUT 2499 數字(思維+數論)

 Problem Description

定義f(x) = {比x小,不可以被x整除並且不和x互質的數的個數}(x為正整數)。

當f(x) 是奇數的時候我們稱x為“奇真數”。

給出兩個數x,y求區間[x,y]內的“奇真數”的個數。

Input

 第一行輸入一個數N代表測試資料個數(N<=20)。接下來N行每行兩個正整數x , y ( 0 < x <= y < 2^31)。

Output

 對於每個測試資料輸出“奇真數”的個數,每行輸出一個結果。

Sample Input

2
1 1
1 10

Sample Output

0
4

誤:

這個題,題目描述有點問題,舉個栗子:5比20小,5還能被20整除?所以開頭那一句應該是不可以整除x。

(這題只做java練習而放這裡不大合適...做比賽題的話還說得過去,拿來考試現做的話就不大現實了,只能是背下來...)

思路:

(腦子不夠使得...還是寫一下邏輯結構)

1.分析題目:此f(x)非上面所指

①在x某範圍內,f(x)運算結果為true的個數如果是奇數,計數器++。

②計算f(x):設符合(我們要找個數的)數的條件為i,那麼,不可整除x:i不是x的約數;不與x互質:i與x有公約數

2.要在所有數中排除這兩種情況。

3.兩種情況是否有交集?如果3是6的約數,那麼3與6有本身作為公約數,於是i與x不互質。所以沒有交集。f(x)=x-互質-約數+1

4.具體討論兩種情況如何實現,這一步驟在大佬這講得很清楚了:https://blog.csdn.net/tclh123/article/details/7970545

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();
		long  x,y;
		while(n-->0)
		{
			x=s.nextInt();
			y=s.nextInt();
			System.out.println(f(y)-f(x-1));
		}
		s.close();
	}
	static long f(long a)
	{
		if(a<=2)
			return 0;
		if((long)Math.sqrt(a)%2==1)
			return a/2-1;
		else 
			return a/2-2;
	}
}