(当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
空间限制: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,我菜鸟一个。上一篇: js 小结
下一篇: 删除数组连续重复的元素