Skip to content

Commit 3dd3e92

Browse files
Merge branch 'master' into feature/power-of-four-check
2 parents 213d5c0 + 98eecb9 commit 3dd3e92

File tree

4 files changed

+174
-0
lines changed

4 files changed

+174
-0
lines changed
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.thealgorithms.conversions;
2+
3+
/**
4+
* A utility class to convert between different temperature units.
5+
*
6+
* <p>This class supports conversions between the following units:
7+
* <ul>
8+
* <li>Celsius</li>
9+
* <li>Fahrenheit</li>
10+
* <li>Kelvin</li>
11+
* </ul>
12+
*
13+
* <p>This class is final and cannot be instantiated.
14+
*
15+
* @author krishna-medapati (https://github.com/krishna-medapati)
16+
* @see <a href="https://en.wikipedia.org/wiki/Conversion_of_scales_of_temperature">Wikipedia: Temperature Conversion</a>
17+
*/
18+
public final class TemperatureConverter {
19+
20+
private TemperatureConverter() {
21+
}
22+
23+
public static double celsiusToFahrenheit(double celsius) {
24+
return celsius * 9.0 / 5.0 + 32.0;
25+
}
26+
27+
public static double celsiusToKelvin(double celsius) {
28+
return celsius + 273.15;
29+
}
30+
31+
public static double fahrenheitToCelsius(double fahrenheit) {
32+
return (fahrenheit - 32.0) * 5.0 / 9.0;
33+
}
34+
35+
public static double fahrenheitToKelvin(double fahrenheit) {
36+
return (fahrenheit - 32.0) * 5.0 / 9.0 + 273.15;
37+
}
38+
39+
public static double kelvinToCelsius(double kelvin) {
40+
return kelvin - 273.15;
41+
}
42+
43+
public static double kelvinToFahrenheit(double kelvin) {
44+
return (kelvin - 273.15) * 9.0 / 5.0 + 32.0;
45+
}
46+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package com.thealgorithms.maths;
2+
3+
import com.thealgorithms.maths.Prime.PrimeCheck;
4+
5+
/**
6+
* In number theory, a smith number is a composite number for which, in a given number base,
7+
* the sum of its digits is equal to the sum of the digits in its prime factorization in the same base.
8+
*
9+
* For example, in base 10, 378 = 21 X 33 X 71 is a Smith number since 3 + 7 + 8 = 2 X 1 + 3 X 3 + 7 X 1,
10+
* and 22 = 21 X 111 is a Smith number, because 2 + 2 = 2 X 1 + (1 + 1) X 1.
11+
*
12+
* Wiki: https://en.wikipedia.org/wiki/Smith_number
13+
*/
14+
public final class SmithNumber {
15+
16+
private SmithNumber() {
17+
}
18+
19+
private static int primeFactorDigitSum(int n) {
20+
int sum = 0;
21+
int num = n;
22+
23+
// Factorize the number using trial division
24+
for (int i = 2; i * i <= num; i++) {
25+
while (n % i == 0) { // while i divides n
26+
sum += SumOfDigits.sumOfDigits(i); // add sum of digits of factor
27+
n /= i; // divide n by the factor
28+
}
29+
}
30+
31+
// If n is still > 1, it itself is a prime factor
32+
if (n > 1) {
33+
sum += SumOfDigits.sumOfDigits(n);
34+
}
35+
36+
return sum;
37+
}
38+
39+
/**
40+
* Check if {@code number} is Smith number or not
41+
*
42+
* @param number the number
43+
* @return {@code true} if {@code number} is a Smith number, otherwise false
44+
*/
45+
public static boolean isSmithNumber(int number) {
46+
if (PrimeCheck.isPrime(number)) {
47+
return false; // Smith numbers must be composite
48+
}
49+
50+
return SumOfDigits.sumOfDigits(number) == primeFactorDigitSum(number);
51+
}
52+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.thealgorithms.conversions;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
import org.junit.jupiter.api.Test;
6+
7+
class TemperatureConverterTest {
8+
9+
private static final double DELTA = 0.01;
10+
11+
@Test
12+
void testCelsiusToFahrenheit() {
13+
assertEquals(32.0, TemperatureConverter.celsiusToFahrenheit(0.0), DELTA);
14+
assertEquals(212.0, TemperatureConverter.celsiusToFahrenheit(100.0), DELTA);
15+
assertEquals(-40.0, TemperatureConverter.celsiusToFahrenheit(-40.0), DELTA);
16+
assertEquals(98.6, TemperatureConverter.celsiusToFahrenheit(37.0), DELTA);
17+
}
18+
19+
@Test
20+
void testCelsiusToKelvin() {
21+
assertEquals(273.15, TemperatureConverter.celsiusToKelvin(0.0), DELTA);
22+
assertEquals(373.15, TemperatureConverter.celsiusToKelvin(100.0), DELTA);
23+
assertEquals(233.15, TemperatureConverter.celsiusToKelvin(-40.0), DELTA);
24+
}
25+
26+
@Test
27+
void testFahrenheitToCelsius() {
28+
assertEquals(0.0, TemperatureConverter.fahrenheitToCelsius(32.0), DELTA);
29+
assertEquals(100.0, TemperatureConverter.fahrenheitToCelsius(212.0), DELTA);
30+
assertEquals(-40.0, TemperatureConverter.fahrenheitToCelsius(-40.0), DELTA);
31+
assertEquals(37.0, TemperatureConverter.fahrenheitToCelsius(98.6), DELTA);
32+
}
33+
34+
@Test
35+
void testFahrenheitToKelvin() {
36+
assertEquals(273.15, TemperatureConverter.fahrenheitToKelvin(32.0), DELTA);
37+
assertEquals(373.15, TemperatureConverter.fahrenheitToKelvin(212.0), DELTA);
38+
assertEquals(233.15, TemperatureConverter.fahrenheitToKelvin(-40.0), DELTA);
39+
}
40+
41+
@Test
42+
void testKelvinToCelsius() {
43+
assertEquals(0.0, TemperatureConverter.kelvinToCelsius(273.15), DELTA);
44+
assertEquals(100.0, TemperatureConverter.kelvinToCelsius(373.15), DELTA);
45+
assertEquals(-273.15, TemperatureConverter.kelvinToCelsius(0.0), DELTA);
46+
}
47+
48+
@Test
49+
void testKelvinToFahrenheit() {
50+
assertEquals(32.0, TemperatureConverter.kelvinToFahrenheit(273.15), DELTA);
51+
assertEquals(212.0, TemperatureConverter.kelvinToFahrenheit(373.15), DELTA);
52+
assertEquals(-40.0, TemperatureConverter.kelvinToFahrenheit(233.15), DELTA);
53+
}
54+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.assertFalse;
4+
import static org.junit.jupiter.api.Assertions.assertTrue;
5+
6+
import org.junit.jupiter.params.ParameterizedTest;
7+
import org.junit.jupiter.params.provider.CsvSource;
8+
9+
class SmithNumberTest {
10+
11+
@ParameterizedTest
12+
@CsvSource({"4", "22", "121", "562", "985", "4937775"})
13+
void positiveSmithNumbersTest(int n) {
14+
assertTrue(SmithNumber.isSmithNumber(n));
15+
}
16+
17+
@ParameterizedTest
18+
@CsvSource({"2", "11", "100", "550", "999", "1234557"})
19+
void negativeSmithNumbersTest(int n) {
20+
assertFalse(SmithNumber.isSmithNumber(n));
21+
}
22+
}

0 commit comments

Comments
 (0)