Zahlenrätsel (neunstellige Zahl) (Schleifen)
Gesucht ist eine neunstellige Zahl (fiktiv: 987654321), die folgenden Kriterien entspricht:
- jede Ziffer von 1 bis 9 darf nur einmal vorkommen,
- die Ziffer Null (0) darf nicht vorkommen,
- die erste Stelle - also die Zahl 9 - ist ohne Rest durch 1 teilbar,
- die ersten 2 Stellen - also die Zahl 98 - ist ohne Rest durch 2 teilbar,
- die ersten 3 Stellen - also die Zahl 987 - ist ohne Rest durch 3 teilbar,
- usw…
- alle neun Stellen - also die Zahl 987654321 - ist ohne Rest durch 9 teilbar.
Schreibe einen Algorithmus, der die einzig mögliche Zahl ausgibt. Wenn möglich, sollte dieser so performant sein, dass die Lösung innerhalb einer Sekunde erscheint.
0 Kommentare
5 Lösung(en)
// aus der bibliothek meiner
// project-euler-helferlein:
function permute(arr) {
var length = arr.length,
result = [arr.slice()],
c = new Array(length).fill(0),
i = 1, k, p;
while (i < length) {
if (c[i] < i) {
k = i % 2 && c[i];
p = arr[i];
arr[i] = arr[k];
arr[k] = p;
++c[i];
i = 1;
result.push(arr.slice());
} else {
c[i] = 0;
++i;
}
}
return result;
}
function check(item) {
// durch die permutationen entfallen die prüfungen auf nullen
// und doppelte stellen
for (let i = 9; i > 1; i--)
if (parseInt(item.join('').slice(0, i)) % i != 0) return false;
return true;
}
// main
console.time();
let p = permute('123456789'.split('')),
x = 0;
while (!check(p[x])) x++;
console.timeEnd();
console.log(p[x].join(''));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// C++ 17
#include <iostream>
#include <algorithm>
#include <string>
int main() {
std::string s{ "123456789" };
while (next_permutation(s.begin(), s.end())) {
auto is_nr{ true };
for (auto i{ s.length() }; i > 0; --i) {
if (std::stoll(s.substr(0, i)) % i != 0) {
is_nr = false;
break;
}
}
if (is_nr) {
std::cout << s << "\n";
break;
}
}
}
Lösung von: Jens Kelm (@JKooP)
// NET 6.x | C# 10.x | VS-2022
var nums = "123456789";
new Permutation().Permute(nums.ToCharArray());
public class Permutation {
public void Permute(char[] lst) => Permute(lst, 0, lst.Length - 1);
private void Permute(char[] arr, int k, int m) {
if (k == m) {
bool is_nr = true;
for (int i = arr.Length; i > 0; --i) {
if (int.Parse(arr.AsSpan()[..i]) % i != 0) {
is_nr = false;
break;
}
}
if (is_nr) {
Console.WriteLine(string.Join("", arr));
return;
}
}
else
for (int i = k; i <= m; i++) {
(arr[k], arr[i]) = (arr[i], arr[k]);
Permute(arr, k + 1, m);
(arr[k], arr[i]) = (arr[i], arr[k]);
}
}
}
Lösung von: Jens Kelm (@JKooP)
def solve_riddle(remaining_nums=set(range(1, 10)), curr_num=0, curr_mod=1):
if not remaining_nums:
return curr_num
for num in remaining_nums:
next_num = 10 * curr_num + num
if next_num % curr_mod != 0:
continue
next_solution = solve_riddle(remaining_nums - {num}, next_num, curr_mod+1)
if next_solution is not None:
return next_solution
print(solve_riddle())
Lösung von: Name nicht veröffentlicht
from itertools import permutations;from re import findall
print([i for i in [int(''.join(findall('[1-9]',str(b)))) for b in list(permutations('123456789'))] if len([b for b in range(9) if int(str(i)[0:b+1])%(b+1)==0])==9][0])
Lösung von: rob ert (tub)
Verifikation/Checksumme:
381654729
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung: