【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;
	}
}

猜你喜欢

转载自blog.csdn.net/flyf000/article/details/84347749