您的位置:首页 > 其它

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

2018-02-04 17:40 369 查看
本题我未卡数据,因此未AC,但主要写下思路。链接:https://www.nowcoder.net/acm/contest/75/G来源:牛客网时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K,其他语言65536K64bit 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 stubScanner 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 stublong 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,我菜鸟一个
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐