Te dejo unas imagenes como me quedo.
La funcion buscar primos se puede optimizar, como por ejemplo no buscar en numeros pares o que terminen en 5, etc. para numeros pequeños no importa
pero si es para numeros grandes tendrias que arreglarlo.
Saludos.
Código:
import java.text.DecimalFormat;
import javax.swing.JOptionPane;
/*
* QuePa.java
*
* Created on 30-09-2007, 10:52:12 PM
*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author Picaporte
*/
public class QuePa {
public static void main(String[] args) {
String nTxt;
String signoString = "";
String resultadoPantalla = "";
int n;
double resultado = 0;
long contador;
long contadorOriginal;
int multiplicadorSigno = -1;
double sumaTotal = 0;
double numerador;
double denominador;
contador = 0;
contadorOriginal = 0;
nTxt = JOptionPane.showInputDialog("Ingrese el Nº de terminos: ");
n = Integer.parseInt(nTxt);
DecimalFormat df = new DecimalFormat();
df.setMaximumFractionDigits(0);
for (int a = 1; a <= n; a++) {
if (esPrimo(a)) {
if (contador == 0) {
contadorOriginal++;
contador = contadorOriginal;
multiplicadorSigno = multiplicadorSigno * -1;
}
numerador = factorial(sumaBinario(a)) * multiplicadorSigno;
denominador = a;
resultado = (numerador / denominador);
sumaTotal = sumaTotal + resultado;
contador--;
if (numerador > 0) {
signoString = "+";
} else {
signoString = "";
}
//desabilitalo si es necesario
resultadoPantalla = resultadoPantalla + (signoString + df.format(numerador) + "/" + df.format(denominador));
}
}
resultadoPantalla = resultadoPantalla + "=" + sumaTotal;
JOptionPane.showMessageDialog(null, resultadoPantalla);
}
public static boolean esPrimo(long numero) {
if (numero == 1) {
return true;
} else {
for (long j = 2; j < numero; j++) {
if ((numero % j) == 0) {
return false;
}
}
}
return true;
}
public static long factorial(long numero) {
if (numero <= 1) {
return 1;
} else {
return numero * factorial(numero - 1);
}
}
public static long sumaBinario(long numero) {
long digito;
long iSuma = 0;
long iExponente;
long resultado = 0;
iSuma = 0;
iExponente = 1;
while (numero > 0) {
digito = numero % 2;
numero = numero / 2;
iSuma = iSuma + digito * iExponente;
iExponente = iExponente * 10;
resultado = digito + resultado;
}
return resultado;
}
}