Cálculos matemáticos diversos em Java

Pessoal
Preciso de um site ou sites que contenham exercícios (algoritmos) de matemática em Java desde os mais simples até com If, Else, While, For e etc. Preciso exercitar com frequencia este tópico. Aviso: Não quero exercícios prontos, resolvidos, quero resolvê-los eu mesmo.
Muito Obrigado.

http://www.spoj.pl/

Você também pode tentar o http://projecteuler.net/

Este site, diferentemente do SPOJ, não aceita programas - ele só aceita as respostas que você conseguir obter através de seu programa.

O primeiro problema do Project Euler é:

Ou seja, ele lhe pede para fazer um programa como este aqui:

class ProjectEuler1 {
    public static void main (String[] args) {
		// Find the sum of all the multiples of 3 or 5 below 1000.
		int sum = 0;
		for (int n = 1; n <= 1000; n++) {
			if (n % 3 == 0 || n % 5 == 0) {
				sum = sum + n;
			}
		}
		System.out.printf ("The sum of all multiples of 3 or 5 below 1000 = %d %n", sum);
	}
}

e postar a saída (que neste caso é 234168 ).

Não importa como você chegou a esse resultado - você pode muito bem ter chegado a esse resultado apenas com lápis e papel.

Só por curiosidade minha, sem querer desvirtuar o tópico.

entanglement, você já arriscou resolver algum problema do spoj? Se sim, achou interessante?

Dá pra ver pelos resultados que quem tenta resolver com Java sempre fica lá embaixo pela performance, obviamente, as vezes nem consegue bater o tempo limite.

Você vai perceber que a maior parte desses problemas não são do tipo “calcule a área de um triângulo, dadas as coordenadas (x, y) de seus vértices” - já que eles são meras aplicações de fórmulas. Na verdade, esses problemas são mais como desafios mesmo.

[quote=digaoneves]Só por curiosidade minha, sem querer desvirtuar o tópico.

entanglement, você já arriscou resolver algum problema do spoj? Se sim, achou interessante?

Dá pra ver pelos resultados que quem tenta resolver com Java sempre fica lá embaixo pela performance, obviamente, as vezes nem consegue bater o tempo limite.[/quote]

Nunca cheguei a resolver um problema do SPOJ. Provavelmente, se fosse tentar resolver um problema desses, iria tentar em C++.

Acho que a resposta ali é 233168, não é?

Entendi, é… realmente eu tive umas tentativas frustradas com Java no SPOJ.

O problema a seguinr, por exemplo, não pode ser resolvido sem você pensar um pouco, É que ele tem uma fórmula difícil de calcular para valores grandes - (∑(p-k)!) mod§ para 1 ≤ k ≤ 5. Você não pode, simplesmente, sair calculando o fatorial de um número grande (o maior primo menor que 10 elevado a 8, que é 99999989), achar o módulo 99999989 e depois somar isso - para vários números. O problema aqui neste caso é achar o módulo de um fatorial grande sem ter de multiiplicat todos os termos.

De fato, a resposta é 233168 e o programa é:

class ProjectEuler1 {
    public static void main (String[] args) {
		// Find the sum of all the multiples of 3 or 5 below 1000.
		int sum = 0;
		for (int n = 1; n < 1000; n++) {
			if (n % 3 == 0 || n % 5 == 0) {
				sum = sum + n;
			}
		}
		System.out.printf ("The sum of all multiples of 3 or 5 below 1000 = %d %n", sum);
	}
}

Não tinha lido corretamente o enunciado - ele pede “below”, não “below or equal to” :slight_smile:

Eu fui fazer a solução que imaginei mais simples para o problema 3, e acabei em um loop que provavelmente duraria alguns dias :slight_smile:

Segue o problema caso alguém se interesse:

[quote]The prime factors of 13195 are 5, 7, 13 and 29.

What is the largest prime factor of the number 600851475143 ?[/quote]

Só para enganar um pouco, chamei o utilitário de fatoração do Unix com esse número para eu ter a resposta antes de procurar uma solução.

Não digo que você, usando o algoritmo bobo, iria levar “alguns dias” (porque o número é bem comportado, afinal de contas - tem fatores pequenos) mas aqui aparecem vários problemas. Por exemplo, como sei que 6857 é primo? O algoritmo bobo (se for muito bobo, mesmo) não consegue dizer logo de cara se o tal fator é primo ou não.

Bom, tenho que dizer que meu erro foi falta de atenção, o algoritmo até que resolveu rapidamente.
Veja só:

meu algoritmo era basicamente isso[code] public static void main(String[] args){
long num = Long.parseLong(“600851475143”);

	int prime = 2;
	
	while(num != 0){
		if(num % prime == 0){
			num = num / prime;
		}else{
			prime = getNextPrime(prime);
		}
	}
	System.out.println(prime);
}[/code]Tem um detalhe crucial aí que fez meu algoritmo rodar muito mais do que deveria, quando corrigi executou rapidinho.

http://projecteuler.net/problem=357

Este problema é mais facilmente resolvido tendo-se uma tabelas dos primos até 20000 (pergunta: por que 20000?)

[quote=entanglement]http://projecteuler.net/problem=357

Este problema é mais facilmente resolvido tendo-se uma tabelas dos primos até 20000 (pergunta: por que 20000?)[/quote]

Boa pergunta, não consigo imaginar ainda.

Na verdade não sou muito bom nessas coisas, mas estou me divertindo aqui com os problemas desse site, realmente é muito bom.

Alguma sugestão para ajudar na resolução do problema 9?

[quote]A Pythagorean triplet is a set of three natural numbers, a b c, for which,

a2 + b2 = c2
For example, 32 + 42 = 9 + 16 = 25 = 52.

There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc.[/quote]

Como esse problema é pequeno (a + b + c = 1000) então pode ser resolvido quase por força bruta.

Note que:

a^2 + b^2 == c^2
a + b + c = 1000
a > 0, b > 0, c > 0
é o enunciado do problema.

Para acelerar o processo de procurar a, b e c tais que a + b + c = 1000 e a^2+b^2-c^2 = 0, você pode supor que:

a < b < c (pense no triângulo retângulo). (Não iremos supor que a <= b porque se a == b, então c = a * sqrt (2), o que não é um número inteiro).

Olhando o triângulo retângulo você concluirá rapidamente que 1 <= b <= 500.

Você basicamente precisa fazer algo como:

for (b = 1; b <= 500; ++b) {
    for (a = 1; a < b; ++a) {
        c = 1000 - (a + b);
        if (a * a + b * b == c * c) {
            System.out.printf ("a = %d, b = %d, c = %d%n", a, b, c);
            break;
....

É, sabe aqueles momentos onde você vê que a solução é muito mas simples do que você imaginava? :slight_smile:

O site da Universidade de Valladolid tem bem mais problemas do que o SPOJ:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=0&limit=50&limitstart=0