liczba całkowita jako suma silni swoich cyfr

0

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....

0

54321 % 10 = 1
5432 % 10 = 2
.
.
.
5 % 10 = 5
0 - stop

0
  1. Albo przez dzielenie ;]
  2. Albo zrzutuj na stringa -> ""+liczba
0

@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?

0
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.

0

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.

0

```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?
0

W funkcji silnia, na początku Dodaj: if (x==0) return 1. I Zaczynaj iterację od int i = 1.

1
 public static int silniacyfr(int x) {
        if(x == 0)
            return 1;
        int n = x % 10;
        return (n == 0 ? 1 : n) * silniacyfr(x / 10);
    }
0

Rekurencyjna silnia to rak

0

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);
	}
}

https://ideone.com/2be0Lx

1 użytkowników online, w tym zalogowanych: 0, gości: 1