Fatoracao

estou com um programa para fatorar… ja fiz algo mando um jar…

aqui consegui uns avanços para automatizar a tarefa… no resultado mostra a quantidade de numeros usados e o divisor que foi usado, que é o que precisarei para calcular o numero de divisores, quais os divisores e depois o mdc.

mas ainda tem um bugzinho… ele dividiu por 11, mas nao contou… estou postando para mostrar o andamento, pretendo resolver isto, mas se interessar alguém e houver dicas, ta válido…

[code]
package numerosprimos;

public class CalculoPrimos_1_1 {

public static void main(String a[]){
int j1=660; //valor de teste…
boolean continua=true; //variavel do while…
int n=1, n2, contPrimo;
float r=0;

int x=0; //marca o valor da array contador…
int contador[]= new int[1000];
int divisor[]= new int[1000];
//+"e o divisor é "+n

System.out.println(“j1=valor:”+j1+“valor de n=: 2”);
while(continua==true){
if(j1%2==0){
j1=j1/2;
System.out.println(“j1=valor:”+j1+“valor de n=2”);
contador[x]=contador[x]+1;
divisor[x]=2; }
else {continua=false;}

if (j1==1){continua=false; //contador[x]–;
}
}
System.out.println(“contador=”+contador[x]);

while(n < 1000){
n2=n-1;
for(contPrimo = n2; contPrimo >= 2; contPrimo=contPrimo-1){
r = n % contPrimo;
if(r == 0){
System.out.println(“O numero “+n+” não é primo!”);
contPrimo=1;
}
}

if(r!=0){
System.out.println(“O numero “+n+” é primo!”);
//se é primo, posso usar meu metodo…
continua=true;
x=x+1;
System.out.println(“j1=valor:”+j1+"valor de n=: "+n);
while(continua==true)
{

System.out.println(“j1=valor:”+j1+"valor de n=: “+n);
System.out.println(“contador[”+x+”] tem valor: "+contador[x]+"e o divisor é "+n);

if (j1%n==0) { j1=j1/n;
contador[x]=contador[x]+1; divisor[x]=n;

}
else {continua=false; }
if (j1==1){continua=false; //se j1=1 está resolvido para de buscar numeros primos…
n=1001; }//if de 1
}
}
n++;

}// terminou o while.

for (int g=0;g<x;g++){
System.out.println(“contador[”+g+"] tem valor: “+contador[g]+” divisor["+g+"] tem valor: "+divisor[g]);
}

}//main
}[/code]

segue aí:

para ajudar… o resultado

run: j1=valor:660valor de n=: 2 j1=valor:330valor de n=2 j1=valor:165valor de n=2 contador=2 O numero 3 é primo! j1=valor:165valor de n=: 3 j1=valor:55valor de n=: 3 contador[1] tem valor: 1e o divisor é 3 O numero 4 não é primo! O numero 5 é primo! j1=valor:55valor de n=: 5 j1=valor:11valor de n=: 5 contador[2] tem valor: 1e o divisor é 5 O numero 6 não é primo! O numero 7 é primo! j1=valor:11valor de n=: 7 O numero 8 não é primo! O numero 9 não é primo! O numero 10 não é primo! O numero 11 é primo! j1=valor:11valor de n=: 11 j1=valor:1valor de n=: 11 contador[4] tem valor: 1e o divisor é 11 contador[0] tem valor: 2 divisor[0] tem valor: 2 contador[1] tem valor: 1 divisor[1] tem valor: 3 contador[2] tem valor: 1 divisor[2] tem valor: 5 contador[3] tem valor: 0 divisor[3] tem valor: 0

o ultimo contador devia ter valor 1 e o divisor 11, pois dividiu o 11 por 11, uma vez… mas nao esta contando …

estou olhando com calma, mas ja posto. for help.

a fatoração éde 660 é : 2 2 3 5 11 (multiplicados) …
problema no último contador somente…

1 curtida

bem consegui o que queria, talvez tenha me antecipado em postar, mas acho um script interessante…
segue o resultado…

[code]

package numerosprimos;

public class CalculoPrimos_1_1 {

public static void main(String a[]){
int j1=660; //valor de teste…
boolean continua=true; //variavel do while…
int n=1, n2, contPrimo;
float r=0;

int x=0; //marca o valor da array contador…
int contador[]= new int[1000];
int divisor[]= new int[1000];
//+"e o divisor é "+n

System.out.println(“j1=valor:”+j1+“valor de n=: 2”);
while(continua==true){
if(j1%2==0){
j1=j1/2;
System.out.println(“j1=valor:”+j1+“valor de n=2”);
contador[x]=contador[x]+1;
divisor[x]=2; }
else {continua=false;}

if (j1==1){continua=false; //contador[x]–;
}
}
System.out.println(“contador=”+contador[x]);

while(n < 1000){
n2=n-1;
for(contPrimo = n2; contPrimo >= 2; contPrimo=contPrimo-1){
r = n % contPrimo;
if(r == 0){
System.out.println(“O numero “+n+” não é primo!”);
contPrimo=1;
}
}
if(r!=0){
System.out.println(“O numero “+n+” é primo!”);
//se é primo, posso usar meu metodo…
continua=true;

//System.out.println(“j1=valor:”+j1+"valor de n=: "+n);
while(continua==true)
{
if (j1%n==0) {x=x+1; contador[x]=contador[x]+1; divisor[x]=n;j1=j1/n;
System.out.println(“j1=valor:”+j1+"valor de n=: “+n);
System.out.println(“contador[”+x+”] tem valor: "+contador[x]+"e o divisor é "+n);

if (j1==1){continua=false; n=1001; }
}
else {continua=false; }
}

}
n++;
}// terminou o while.

for (int g=0;g<(x+1);g++){
System.out.println(“contador[”+g+"] tem valor: “+contador[g]+” divisor["+g+"] tem valor: "+divisor[g]);
}

}//main
}[/code]

segue o jar da ideia do projeto que esta tomando forma… aceito dica,etc.

ontem eu ia postar algo, questionando o porque do script para achar numeros primos, nao identificar o 2, que tb é primo… tentei e nao consegui, para dar sequencia, diz o numero 2, separado… da para perceber. mas alguem percebe a causa, de nao aparecer o 2? valeu.

estou procurando, mas como ja fiz de outra forma, deixei estacionado por enquanto.

Não entendi pra que tanto código…

O que tu queres é isso:?

[code]public static void main(String[] args) throws Exception {
int number = 660;
int[] divisores = new int[number/2];
int atual = 0;

for (int i = number/2; i > 1; i--) {
	if ( (number % i) == 0  ) {
		if ( isPrimo( i ) ) {
			divisores[atual++] = i;
		}
	}
}
if ( atual > 0 ) {
	System.out.println( number + " não é primo");
	for (int i = 0; i < atual; i++) {
		System.out.println( number + "/" + divisores[i] + "=" + number/divisores[i]  );
	}
} else {
	System.out.println( number + " é primo");
}

}
public static boolean isPrimo ( int i ) {
for (int j = (i/2); j > 1 ; j–) {
if ( (i%j) == 0 ) {
return false;
}
}
return true;
}[/code]

Podem ser feitos melhorias, como a substituição do Array “divisores” por um ArrayList, o que evitaria a “gambi” na inicialização e a criação do contador atual… mas seria basicamente isso não?

bem vou testar seu programa. a gami no inicio nao é tão gambi, quero os primos até 1000 por exemplo…

nao sei se seu programa esta fatorando como o meu…

bem testei, seu programa faz isto.

660 não é primo 660/11=60 660/5=132 660/3=220 660/2=330

isto nao é fatorar, vc dividiu o mesmo numero pelos primos… tem que dividir sequencialmente.

apos a fatoração, o contador atual cria a função de ver quantos numeros repetidos foram utilizados, por exemplo

660 é igual a 2.2.3.5.11 (multiplicados no caso),
isto é fatorar.
entao o contador do 2, tem valor dois, pois foram usados duas vezes o dois. vou precisar disso para ver o numero de divisores, e futuramente o mdc…

algo sobre mdc, aí pessoal do forum…
apesar que tenho minha idéia.

a gambiarra que tem é que o dois esta sendo calculado separado, pois o metodo para achar primos, só acha os primos após o 3…

e nao vi o porque. troquei valores…

De fato, não me liguei realmente no título e no conteúdo do teu programa, apenas no pacote e no nome da classe… foi mal…
Sobre a gambi, me referi a minha, não “a sua”(que de fato não é uma gambi, como explicasse)…

Vou olhar com calma depois e estudar um pouco de mdc (que realmente não é minha especialidade) pra não falar mais bobeira :stuck_out_tongue:

neste tópico tem o jar do matematica java, da uma olhada aí.

este link fala do mdc.

em todo caso seu método de numero primo, pareceu mostrar o dois, depois vou estudar isto tb… porque de fato o meu começa do 3, e peguei aqui no guj, acho… a fatoracao eu fiz.