Primeiro acho melhor simplificar o código original, aí fica mais fácil “traduzir” pra outra linguagem.
O código está iterando por todos os números entre a e b, e verificando se a soma dos dígitos é igual a s.
Sendo assim, não precisa criar uma lista com todos os números, pode iterar pelo próprio range. E não precisa transformar cada número em string (é isso que o format está fazendo), para depois usar esta string para somar os dígitos (dá pra fazer isso com “continhas” bem básicas). E não precisa guardar tudo em outra lista, só para depois fazer outro for que compara seus valores com s.
Ou seja, o código original poderia ser assim:
def soma_digitos(n):
soma = 0
while n > 0:
n, d = divmod(n, 10)
soma += d
return soma
s = int(input())
a = int(input())
b = int(input())
check = 0
# para cada número do range
for n in range(a, b + 1):
# verifica se a soma dos dígitos é igual a "s"
if s == soma_digitos(n):
check += 1
print(check)
Tendo isso, traduzir para Java fica muito mais simples:
public static int somaDigitos(int n) {
int soma = 0;
while (n > 0) {
soma += n % 10;
n /= 10;
}
return soma;
}
public static void main(String[] args) throws Exception {
Scanner scan = new Scanner(System.in);
int s = scan.nextInt();
int a = scan.nextInt();
int b = scan.nextInt();
int check = 0;
// para cada número entre "a" e "b"
for (int n = a; n <= b; n++) {
// verifica se a soma dos dígitos é igual a "s"
if (s == somaDigitos(n)) {
check++;
}
}
System.out.println(check);
}
Não acho que valha a pena converter o código original, pois como já explicado, eu acho que possui complicações desnecessárias (criar listas à toa, etc). Mas se ainda sim quiser, pode seguir as dicas dadas acima.