Jak napisać metodę która będzie liczyła takie coś. Czy można jakoś w ogóle odwoływać się do poszczególnych cyfr inta? to ułatwiło by sprawe....
54321 % 10 = 1
5432 % 10 = 2
.
.
.
5 % 10 = 5
0 - stop
- Albo przez dzielenie ;]
- Albo zrzutuj na stringa ->
""+liczba
@stivens: próbowałem zrobić coś według twojego schematu ale nie za bardzo wyszło: https://4programmers.net/Pastebin/14788 , jak zrobić by po każdym razie odcinało tą cyfrę na końcu?
int s = 0;
while (n > 0){
s += factorial(n % 10);
n /= 10;
}
Silnie sobie Dopisz, Pamiętaj o przepełnieniu i trzeba zrobić oddzielny przypadek dla zera.
Za pomocą % 10 dostajesz się do pojedynczej cyfry. Potem jeśli chcesz otrzymać daną liczbę już bez tej cyfry, to po prostu dzielisz liczbę przez 10. Napisz pętlę, która to wykonuje dopóki wynik z dzielenia nie da 0 (pamiętaj, że % 10 nie powinno się kończyć na 0, bo liczba może mieć w środku tą cyfrę i wtedy zakończenie pętli da niepoprawny wynik).
No i napisz sobie najlepiej jakieś proste rekursywne obliczanie silni w osobnej metodzie, do której będziesz podawał w tamtej pętli cyfry otrzymane w sposób, który opisałem.
```public class NewClass {
public static void main(String[]args){
System.out.println( silniacyfr(321));
}
public static int silnia(int x) {
int silnia = 1;
for (int i = 0; i<=x;i++){
silnia*= i;
}
return silnia;
}
public static int silniacyfr(int x) {
int suma = 0;
while(x>0){
suma+=silnia(x%10);
x/=10;
}
return suma;
}
}
//zwróciło 0 podczas gdy pownno 3! +2! +1!= 9, wie ktoś dlaczego?
W funkcji silnia, na początku Dodaj: if (x==0) return 1
. I Zaczynaj iterację od int i = 1
.
public static int silniacyfr(int x) {
if(x == 0)
return 1;
int n = x % 10;
return (n == 0 ? 1 : n) * silniacyfr(x / 10);
}
Rekurencyjna silnia to rak
A masz:
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static int calc(int number) {
// edge case
if (number == 0) {
return 1;
}
int[] digitCount = new int[10];
int[] digitFactorial = new int[10];
int maxDigit = 0;
int result = 0;
int runNumber = number;
// convert number to digit counters
while(runNumber > 0) {
int digit = runNumber % 10;
digitCount[digit]++;
if (maxDigit < digit) {
maxDigit = digit;
}
runNumber /= 10;
}
// calculate required factorials
digitFactorial[0] = 1;
for(int i=1; i <= maxDigit; i++) {
digitFactorial[i] = digitFactorial[i-1] * i;
}
// calculate sum
for(int i=0; i <= maxDigit; i++) {
result += (digitFactorial[i] * digitCount[i]);
}
// debug
//System.out.printf("Number: %d, Factorials: %s, Counts: %s%n", number,
// Arrays.toString(digitFactorial),
// Arrays.toString(digitCount));
return result;
}
private static void test(int testId, int number, int expectedValue) {
int result = calc(number);
if (result == expectedValue) {
System.out.printf("Test %d: OK%n", testId);
} else {
System.out.printf("Test %d: failed, expected %d, result %d%n", testId, expectedValue, result);
}
}
public static void main (String[] args) throws java.lang.Exception
{
test(1, 0, 1);
test(2, 1, 1);
test(3, 101, 3);
test(4, 2, 2);
test(5, 3, 6);
test(6, 4, 24);
test(7, 9, 362880);
test(8, 91, 362880+1);
test(9, 912, 362880+1+2);
}
}