【java練習】SDUT 2499 數字(思維+數論)
阿新 • • 發佈:2018-11-26
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; } }