首先,这不是家庭作业......在课堂外工作以获得一些java练习。
public class Problem3 {
public static void main(String[] args) {
int n = 13195;
// For every value 2 -> n
for (int i=2; i < n; i++) {
// If i is a multiple of n
if (n % i == 0) {
// For every value i -> n
for (int j=2; j < i; j++) {
if (n % j != 0) {
System.out.println(i);
break;
}
}
}
}
}
}
我一直在修改代码,试图让它做我想做的事。
正如问题所说,你应该得到5,7,13和29。
我得到了这些值,加上35,65,91,145,203,377,455,1015,1885和2639.我想我已经走上正轨,因为我拥有所有正确的数字......有一些额外的东西。
在检查两个数字都可以被n整除并且是素数时,这里的问题是额外的数字不是素数。不知道发生了什么事。
如果有人有任何见解,请分享。
答案 0 :(得分:2)
这部分
for (int j=2; j < i; j++) {
if (n % j != 0) {
System.out.println(i);
break;
}
不检查i
是否为素数。除非i
很小,否则在某些时候始终会打印i
,因为小于i
的数字不会划分n
。所以基本上,这将打印出n
的所有除数(例如,它不会打印4
的除数n == 12
,但这是一个例外。)
另请注意,算法 - 使用long
代替int
来避免溢出 - 即使已修复以检查除数i
是否是决定是否打印它的主要因素,也需要很长一段时间来竞争实际的目标。您应该进行调查以找到更好的算法(提示:您可能希望找到完整的素数因子分解)。
答案 1 :(得分:1)
我在Java中解决了这个问题并查看了我的解决方案,明显的建议是开始使用BigInteger,查看java.math.BigInteger的文档
此外,很多这些问题都是“数学”问题,因为它们是“计算机科学”问题所以更多地研究数学,确保在提出算法之前合理地理解数学。蛮力可以工作一段时间,但往往有这些问题的技巧。
答案 2 :(得分:0)
Brut force也可用于检查因子是否为素数... 例如
for(i=1;i<=n;i++)// n is a factor.
{
for(j=i;j>=1;j--)
{
if(i%j==0)
{
counter++;// set counter=0 befor.
}
if(counter==2) // for a prime factor the counter will always be exactly two.
{
System.out.println(i);
}
counter=0;
}
}
答案 3 :(得分:0)
不了解Java,但如果有任何帮助,这里是我的C代码。
# include <stdio.h>
# include <math.h>
// A function to print all prime factors of a given number n
void primeFactors(long long int n)
{
// Print the number of 2s that divide n
while (n%2 == 0)
{
printf("%d ", 2);
n = n/2;
}
int i;
// n must be odd at this point. So we can skip one element (Note i = i +2)
for ( i = 3; i <= sqrt(n); i = i+2)
{
// While i divides n, print i and divide n
while (n%i == 0)
{
printf("%d ", i);
n = n/i;
}
}
// This condition is to handle the case whien n is a prime number
// greater than 2
if (n > 2)
printf ("%ld ", n);
}
/* Driver program to test above function */
int main()
{
long long int n = 600851475143;
primeFactors(n);
return 0;
}
答案 4 :(得分:0)
非常好的是你在课堂上解决这些问题。 看到你的代码。您正在main函数/线程中编写过程代码。 而是首先通过算法逐步编写函数并进行思考。 解决这个问题的简单算法可以是这样的:
还有一个建议是尝试编写单独的函数以避免代码复杂性。 代码是这样的......
public class LargestPrimeFactor {
public static long getLargestPrimeFactor(long num){
long largestprimefactor = 0;
for(long i = 2; i<=num/2;i++){
if(isPrime(i)){
if(num%i==0){
largestprimefactor = i;
System.out.println(largestprimefactor);
}
}
}
return largestprimefactor;
}
public static boolean isPrime(long num){
boolean prime=false;
int count=0;
for(long i=1;i<=num/2;i++){
if(num%i==0){
count++;
}
if(count==1){
prime = true;
}
else{
prime = false;
}
}
return prime;
}
public static void main(String[] args) {
System.out.println("Largest prime factor of 13195 is "+getLargestPrimeFactor(13195));
}
}