欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(当n属于long范围时)给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数

程序员文章站 2024-01-20 19:48:58
...

本题我未卡数据,因此未AC,但主要写下思路。

链接:https://www.nowcoder.net/acm/contest/75/G

来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。

输入描述:

本题有多组输入
每行一个数n,1<=n<=10^18.

输出描述:

每行输出输出不是2 5 11 13的倍数的数共有多少。

示例1

输入

15

输出

4

说明

1 3 7 9

解题思路:
先分别求有多少是2、5、11、13的倍数,设分别有a、b、c、d个。
然后分别求有多少是10(2和5最小公倍数)、22(2和11最小公倍数)、26(2和13最小公倍数)、55(5和11最小公倍数)、65(5和13最小公倍数)、143(11和13)最小公倍数的倍数,设分别有e、f、g、h、i、j个。
再分别求有多少是110(2、5、11最小公倍数)、130(2、5、13最小公倍数)、715(5、11、13最小公倍数)、286(2、11、13最小公倍数)的倍数,设分别有k、l、m、n个。
再求有多少是1430(2、5、11、13最小公倍数)的倍数,设有o个,
最后,不是2、5、11、13的倍数的数字有:
[n-(a+b+c+d)+(e+f+g+h+i+j)-(k+l+m+n)+o]个
代码如下:
package lanqiao;
/*
 * 
 * 链接:https://www.nowcoder.net/acm/contest/75/G
 * 来源:牛客网
题目描述 
给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数。 
输入描述:
本题有多组输入
每行一个数n,1<=n<=10^18.
输出描述:
每行输出输出不是2 5 11 13的倍数的数共有多少。
输入

15
输出

4
说明

1 3 7 9
 */
import java.util.Scanner;
public class G_problem {
	public static long num(long n,int a) {
		long b=0;
		for(long i=1;i<=n;i++) {
			if(i%a==0) {
				b=b+1;
			}
		}
		return b;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		long nn=cin.nextLong();
//		long a,b,c,d;
//		long e,f,g,h,i,j;
//		long k,l,m,n;
//		long o;
//		a=b=c=d=e=f=g=h=i=j=k=l=m=n=o=0;
		int[] x= {2,5,11,13};
		int[] y= {10,22,26,55,65,143};
		int[] z= {110,130,725,286};
		int[] h= {1430};
		long sum=0,sum1=0,sum2=0,sum3=0;
		for(int i=0;i<x.length;i++) {
			sum+=num(nn,x[i]);
		}
		for(int i=0;i<y.length;i++) {
			sum1+=num(nn,y[i]);
		}
		for(int i=0;i<z.length;i++) {
			sum2+=num(nn,z[i]);
		}
		for(int i=0;i<h.length;i++) {
			sum3+=num(nn,h[i]);
		}
//		System.out.println(a+" "+b+" "+c+" "+d);
		System.out.println(nn-sum+sum1-sum2+sum3);
	}

}
由于这里n属于【1,10^18】,数据溢出了,等我找到如何解决范围问题再来更新解决办法。

发现而这个数量也很有意思,1到num中整除c的数量正是num/c的值。
因此也可这样写:

package lanqiao;
import java.util.Scanner;
public class G_problem1 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long n,cnt;
		Scanner cin=new Scanner(System.in);
		n=cin.nextLong();
		cnt=n-(n/2)-(n/5)-(n/11)-(n/13);
		cnt=cnt+(n/10)+(n/22)+(n/26)+(n/55)+(n/65)+(n/143);
		cnt=cnt-(n/110)-(n/130)-(n/715)-(n/286);
		cnt=cnt+(n/1430);
		System.out.println(cnt);
	}

}
不知道是哪里有问题没有AC(当n属于long范围时)给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数,我菜鸟一个(当n属于long范围时)给出一个数n,求1到n中,有多少个数不是2 5 11 13的倍数

相关标签: 算法 数据处理