求问:写OJ,使用java和C++的问题

今天写了人生第一道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的问题么,如果是,应该怎么解决?自此求问各位大神。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问