Zahlenspiel (Schleifen)
In einem Spiel werden die Zahlen von 1 bis n durchgezählt. Man kann nun folgende Feststellung machen: Die 12. Zahl, die mit den Ziffern 253 beginnt, ist 25 300; denn 253 ist die 1., 2530 die 2., 2531 die 3., 2539 die 11., und 25 300 die 12. Zahl.
Schreiben Sie eine Programm, das die 1000. Zahl ermittelt, die mit den Ziffern 9876 beginnt.
Zusatzaufgabe: Verallgemeinern Sie die Aufgabe (die n-te Zahl, die mit vorgegebenen Ziffern beginnt).
0 Kommentare
5 Lösung(en)
def nzahl(basis,n ):
jj=0
z=basis
s=''
while (jj < n):
s =str(z)
if s.startswith(str(basis)):
jj+=1
z+=1
return z-1
print nzahl(253, 12)
function getNthNumberStartingWithX(nth, x) {
let i = x, count = 0;
x = x.toString();
while (count < nth) {
if (i.toString().indexOf(x) == 0) count++;
i++;
}
return i;
}
console.log(getNthNumberStartingWithX(1000, 9876));
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET Core 3.x
// Lösung durch Berechnen des Subtrahenden
using System;
namespace CS_MDL_CORE_Zahlenspiel
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(GetNumber(253, 12));
Console.WriteLine(GetNumber(253, 112));
Console.WriteLine(GetNumber(9876, 1000));
}
static int GetNumber(int value, int nth)
{
var lengthZeros = (int)Math.Log10(nth);
var leadingZeros = new string('0', lengthZeros);
var subtrahend = 1;
var length = 0;
var exponent = 0;
if (nth == 0 || nth == 1) return value;
while (true) // Subtrahenden ermitteln: 2, 12, 112 ...
{
var power = (int)Math.Pow(10, exponent);
if (nth >= subtrahend + power)
{
subtrahend += power;
length++;
}
else break;
exponent++;
}
return int.Parse(value + (leadingZeros + (nth - subtrahend))[^length..]);
}
}
}
Lösung von: Jens Kelm (@JKooP)
#include <iostream>
#include <string>
#include <vector>
struct Pair { int val, nth; };
const auto get_number(const Pair& p) {
const auto leading_zeros{ std::string(long long(log10(p.nth)), '0') };
auto subtrahend{ 1 }, exponent{ 0 };
if (p.nth == 0 || p.nth == 1) return p.val;
while (1) { // Subtrahenden ermitteln: 2, 12, 112, 1112, ... (Zusatzaufgabe)
const auto power{ int(pow(10, exponent++)) };
if (p.nth >= subtrahend + power)
subtrahend += power;
else break;
}
const auto num{ leading_zeros + std::to_string((p.nth - subtrahend)) };
return std::stoi(std::to_string(p.val) + num.substr(num.length() - (exponent-1ll)));
}
int main() {
const std::vector<Pair>pairs{ {253, 12}, {253, 112}, {9'876, 1'000}, {9'876, 105'999} };
for(const auto& pair : pairs)
std::cout << get_number(pair) << "\n";
/* 25300
253000
9876888
987694887 (0,04 ms)
*/
}
Lösung von: Jens Kelm (@JKooP)
' VBA
Type Pair
val As Integer
nth As Integer
End Type
Function GetNumber(pair_ As Pair) As Long
Set wsf_ = WorksheetFunction
Dim subtrahend_ As Integer, exponent_ As Integer
Dim power_ As Long
Dim leadingZeros_ As String
subtrahend_ = 1
leadingZeros_ = String(CInt(wsf_.Log10(pair_.nth)), "0")
If pair_.nth = 0 Or pair_.nth = 1 Then
GetNumber = pair_.val
Exit Function
End If
Do While True
power_ = WorksheetFunction.Power(10, exponent_)
If pair_.nth > (subtrahend + power_) Then
subtrahend_ = subtrahend_ + power_
exponent_ = exponent_ + 1
Else
Exit Do
End If
Loop
GetNumber = CLng(CStr(pair_.val) & right(leadingZeros_ & CStr((pair_.nth - subtrahend_)), exponent_))
End Function
Sub Main()
Dim pair_ As Pair
pair_.val = 9876
pair_.nth = 1000
Debug.Print GetNumber(pair_)
End Sub
Lösung von: Jens Kelm (@JKooP)
Verifikation/Checksumme:
Die 1000. Zahl, die mit den Ziffern 9876 beginnt, lautet 9 876 888.
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Meta
Zeit: | 1 |
Schwierigkeit: | k.A. |
Webcode: | vg42-rghx |
Autor: | Philipp G. Freimann (BBW (Berufsbildungsschule Winterthur) https://www.bbw.ch) |