(当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,我菜鸟一个。
相关文章推荐
- 有多少个数不是2 5 11 13的倍数。 (大数)
- 把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
- C#--第2周实验--任务11--编写一个控制台应用--1列数规则如下:1,1,2,3,5,8,13,21,34...求第30位数是多少?(用递归算法实现)
- 有一个整数n,写一个函数f(n),返回0~n之间出现的“1”的个数,例如f(1)=1; f(13)=6(1,10,11,12,13一共6个1),最大的f(n)=n的n是多少
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- 拼图游戏 复制粘贴一个叫lemene的人的,这个人是c++博客的用户,我不是,怕以后找不到这篇文章,所以复制粘贴了。文中最后给出了原文链接连接
- 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
- 编一个程序求质数的和,例如F(7)=2+3+5+7+11+13 +17=58。
- java 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,
- 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- [经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素
- 用java编写一个求质数的和。f(7)=1+3+5+7+11+13+17=58 要求,写一个求质数的和的方法,然后main方法调用这个方法打印出结果,打印语句写在main方法中
- 给定一个数N,求出1-N之间的数字有多少个1,例如N=11时结果为4(只有1,10,11含1)
- 数据结构:有人设计以下算法用于删除整数顺序表L中所有值在[x,y]范围内的元素,该算法显然不是高效的,请设计一个同样功能的高效算法。
- 网易面试题之小易是一个数论爱好者,并且对于一个数的奇数约数十分感兴趣。一天小易遇到这样一个问题: 定义函数f(x)为x最大的奇数约数,x为正整数。 例如:f(44) = 11. 现在给出一个N,需要求
- 做为一个社会的人,不是靠能写多少行代码,代码多么优雅水平多么高来衡量身家的。
- php 如何快速判断一个数字属于什么范围
- 编写一个程序,分别以signed和unsigned限定的char、short、int与long类型的变量取值范围