C# :: Aufgabe #358
5 Lösungen
Divisionsrest (Modulo) aus einer Zahl und ihrer Ziffern
Anfänger - C#
von JKooP
- 11.02.2021 um 19:17 Uhr
Ziel soll es sein, eine beliebige Integer-Zahl dahingehend zu überprüfen,
ob die Zahl dividiert durch jede ihrer Ziffern immer den Rest 0 ergibt (Modulo = mod).
Dazu soll eine Methode/Funktion erstellt werden, die zwei Integer-Zahlen (Min, Max) aufnimmt
und alle Lösungen im angegebenen Bereich (Min-Max) als Integer-Array zurückgibt.
Beispiel:
Min = 1
Max = 20
Lösung: = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15 ]
Erläuterung (Auszug):
Zahl 9: 9 mod 9 = 0 => true (gilt für jede einstellige Zahl)
Zahl 10: 10 mod 1 = 0; 10 mod 0 = 10 => false, da nicht beide den Rest 0 haben
Zahl 12: 12 mod 1 = 0; 12 mod 2 = 0 => true
Zahl 14: 14 mod 1 = 0; 14 mod 4 = 2 => false, da nicht beide den Rest 0 haben
Viel Spaß
ob die Zahl dividiert durch jede ihrer Ziffern immer den Rest 0 ergibt (Modulo = mod).
Dazu soll eine Methode/Funktion erstellt werden, die zwei Integer-Zahlen (Min, Max) aufnimmt
und alle Lösungen im angegebenen Bereich (Min-Max) als Integer-Array zurückgibt.
Beispiel:
Min = 1
Max = 20
Lösung: = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 15 ]
Erläuterung (Auszug):
Zahl 9: 9 mod 9 = 0 => true (gilt für jede einstellige Zahl)
Zahl 10: 10 mod 1 = 0; 10 mod 0 = 10 => false, da nicht beide den Rest 0 haben
Zahl 12: 12 mod 1 = 0; 12 mod 2 = 0 => true
Zahl 14: 14 mod 1 = 0; 14 mod 4 = 2 => false, da nicht beide den Rest 0 haben
Viel Spaß
Lösungen:
using static System.Console; //.net 5.0.2 VS Community 2019
int imin = 1, imax = 301;
WriteLine(aufgabe_358(imin, imax).ToMyString());
ReadKey();
//------------------------------------------------------------------------------
int[] aufgabe_358(int imin, int imax) {
var temp = new System.Collections.Generic.List<int>();
for (var i = imin; i <= imax; i++) {
var ii = i; var bo = true;
do {
var mo = ii % 10;
if (Mod(i, mo) != 0)
bo = false;
ii /= 10;
} while (ii != 0);
if (bo)
temp.Add(i);
}
return temp.ToArray();
}
int Mod(int z1, int z2) => z2 != 0 ? z1 % z2 : z1;
static class Extension {
public static string ToMyString(this int[] X) {
var sb = new System.Text.StringBuilder();
foreach (int x in X)
sb.Append($"{x} ");
return sb.ToString();
}
}
using System;
using System.Collections.Generic;
namespace TJP358_Divisionsrest
{
class Program
{
/// <summary>
/// Main
/// </summary>
static void Main(string[] args)
{
// Prüfung
var arrayValues = Calculate(1, 100);
// Ausgabe
foreach (var item in arrayValues)
{
Console.WriteLine(item);
}
}
/// <summary>
/// Prüfen der Zahlenwerte
/// </summary>
private static int[] Calculate(int min, int max)
{
List<int> listResults = new List<int>();
// alle Zahlenwerte prüfen
for (int j = min; j <= max; j++)
{
string value = j.ToString();
List<int> listDigits = new List<int>();
// Ziffern der Zahl ermitteln
for (int i = 0; i < value.Length; i++)
{
if (int.TryParse(value[i].ToString(), out int result))
listDigits.Add(result);
}
// Zahl überprüfen
// ok = true wenn Zahl % Ziffer = 0
bool ok = true;
foreach (var digit in listDigits)
{
if (digit == 0 || (j % digit) != 0)
ok = false;
}
if (ok)
listResults.Add(j);
}
return listResults.ToArray();
}
}
}
using System;
using System.Text;
namespace DivisionstestModulo
{
class Program
{
static void Main(string[] args)
{
int minValue = 1;
int maxValue = 20;
StringBuilder sb = new StringBuilder();
for (int i = minValue; i <= maxValue; i++)
{
bool isModuloZero = false;
char[] digits = i.ToString().ToCharArray();
foreach (char diget in digits)
{
double nDiget = Char.GetNumericValue(diget);
if (nDiget == 0)
{
isModuloZero = false;
break;
}
double diff = i / nDiget;
double rest = diff - Math.Truncate(diff);
if (rest == 0)
isModuloZero = true;
else
{
isModuloZero = false;
break;
}
}
if (isModuloZero)
sb.Append($"{i}, ");
}
Console.WriteLine(sb);
}
}
}
NET 5.x; C# 9.x; VS-2019
C#-Code
using System.Collections.Generic;
using System.Linq;
const int min = 1, max = 100;
System.Console.WriteLine(string.Join(", ", SelfDividingNumbers(min, max)));
IEnumerable<int> SelfDividingNumbers(int min, int max)
{
foreach (var l in Enumerable.Range(min, max - min + 1))
if (l.ToString().All(x => l % char.GetNumericValue(x) == 0))
yield return l;
}
NET 5.x; C# 9.x; VS-2019
C#-Code
using System.Collections.Generic;
const int min = 1, max = 100;
System.Console.WriteLine(string.Join(", ", SelfDividingNumbers(min, max)));
IEnumerable<int> SelfDividingNumbers(int min, int max)
{
for (var n = min; n <= max; n++)
{
var m = n;
var b = true;
while (m > 0)
{
var t = m % 10;
if (t == 0 || n % t != 0)
{
b = false;
break;
}
m /= 10;
}
if (b) yield return n;
}
}
