今天写了人生第一道OJ题目:
给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
自己写的第一个解决方案(很天真):
import java.util.*;
public class show
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
int N;
int number=0;
//System.out.println("请输入N:");
N=input.nextInt();
for(int i=1;i<=N;i++)
{
if(i % 2!=0)
{
if(i % 3 !=0)
{
if(i % 5!=0)
{
if(i % 7 !=0)
{
number++;
}
}
}
}
}
System.out.println(number);
}
}
很明显不能通过!
所以上网copy了一段成功运行的代码:
#include
#include
#include
#include
#include
#include
#pragma warning(disable:4996)
using namespace std;
long long n,num,a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,bcd,acd,abcd;
int main()
{
cin>>n;
num=0;
a=n/2;
b=n/3;
c=n/5;
d=n/7;
ab=n/6;
ac=n/10;
ad=n/14;
bc=n/15;
bd=n/21;
cd=n/35;
abc=n/30;
abd=n/42;
acd=n/70;
bcd=n/105;
abcd=n/210;
num=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
cout<<n-num<<endl;
return 0;
}
这一次成功运行了。
于是自己又去学了下容斥原理,写出以下的java代码(这个是更改后和c++的代码很像):
import java.util.*;
public class show
{
public static void main(String args[])
{
Scanner input=new Scanner(System.in);
long N;
long a,b,c,d,ab,ac,ad,bc,bd,cd,abc,abd,acd,bcd,abcd;
long sum=0;
//System.out.println("请输入N:");
N=input.nextInt();
//sum=(N/a)+(N/b)+(N/c)+(N/d)-(N/a/b)-(N/a/c)-(N/a/d)-(N/b/c)-(N/b/d)-(N/c/d)+(N/a/b/c)+(N/a/b/d)+(N/a/c/d)+(N/b/c/d)-(N/a/b/c/d);
a=N/2;
b=N/3;
c=N/5;
d=N/7;
ab=N/6;
ac=N/10;
ad=N/14;
bc=N/15;
bd=N/21;
cd=N/35;
abc=N/30;
abd=N/42;
acd=N/70;
bcd=N/105;
abcd=N/210;
sum=a+b+c+d-ab-ac-ad-bc-bd-cd+abc+abd+acd+bcd-abcd;
System.out.print(N-sum);
}
}
结果不能运行,求问问题出在哪里,跟AC的C++代码很接近,是因为java的问题么,如果是,应该怎么解决?自此求问各位大神。