Sonntage (Schleifen)
Die folgenden Informationen sind gegeben:
- Der 1 Januar 1900 war ein Montag
- 30 Tage haben folgende Monate:
September, April, Juni und November.
Die restlichen Monate haben 31 Tage, abgesehen
von Februar, welcher 28 Tage und beim Schaltjahr 29 Tage hat.
Wieviele Sonntage fallen auf den ersten des Monats zwischen 1900 und 2000 auf(1 Jan 1901 bis 31 Dez. 2000)?
1 Kommentare
17 Lösung(en)
- c
- python
- generic
- java
- generic
- csharp
- generic
- python
- javascript
- csharp
- cpp
- cpp
- cpp
- vb
- c
- csharp
- csharp
#include <stdio.h>
#include <stdlib.h>
#define true 1==1
#define false !true
int day(int month, int year){
int x, y, c;
switch(month) {
case 1:
case 5:
x = 0; break;
case 8:
x = 1; break;
case 3:
case 11:
x = 2; break;
case 6:
case 2:
x = 3; break;
case 9:
case 12:
x = 4; break;
case 4:
case 7:
x = 5; break;
case 10:
x = 6; break;
}
y = month == 1 || month == 2 ? (year + 99) % 100 : year % 100;
c = month != 1 && month != 2 ? year / 100 : (year % 100 == 0 ? year / 100 - 1 : year/100);
return (1 + x + y + y/4 + c/4 -2*c) % 7;
}
int main(int argc, char *argv[]){
int count = 0;
for (int j=1901; j<=2000; j++){
for (int m=1; m<=12; m++){
if(day(m, j) == 0){
printf("01.%02d.%d\n", m, j);
count++;
}
}
}
printf("%d Sonntage fallen auf den ersten des Monats zwischen 01.01.1901 und 31.12.2000\n", count);
return 0;
}
Lösung von: André Trobisch ()
import datetime
def sonntage_1901_2001():
sonntage = 0
for jahr in range(1901, 2001):
for monat in range(1, 13):
tag = datetime.date(jahr, monat, 1)
if tag.weekday() == 6:
sonntage += 1
return sonntage
print(sonntage_1901_2001()) --> 171
Lösung von: Houssein Fofana ()
'15.3.2017 - PowerBASIC 10
''mit Schleifen seit 1.1.1900 anstelle von integrierten Datumsfunktionen...
#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
DIM zwDatum AS STRING
DIM zwJahr AS INTEGER
DIM zwMonat AS INTEGER
DIM zwTag AS INTEGER
DIM i AS LONG
DIM Sonntage AS INTEGER
zwTag = 1
zwMonat = 1
zwJahr = 1900
Sonntage = 0
i = 1
DIM Schaltjahr AS INTEGER
DO UNTIL zwDatum = "20001231"
INCR i
'Jahre durchgehen
INCR zwTag
IF zwTag > DaysInMonth (zwMonat, zwJahr) THEN
INCR zwMonat
zwTag = 1
IF zwMonat = 13 THEN
INCR zwJahr
zwMonat = 1
END IF
END IF
zwDatum = FORMAT$(zwJahr) & FORMAT$(zwMonat,"00") & FORMAT$(zwTag,"00")
'Sonntage am 1. des Monats seit 01.01.1901
IF zwJahr > 1900 AND _
zwTag = 1 AND _
i MOD 7 = 0 _
THEN INCR Sonntage
LOOP
MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$
END FUNCTION
'-----------------------------------------
FUNCTION DaysInMonth(D_Month AS INTEGER, Year AS INTEGER) AS INTEGER
LOCAL Days AS INTEGER
SELECT CASE D_Month
CASE 1, 3, 5, 7, 8, 10, 12
Days = 31
CASE 4, 6, 9, 11
Days = 30
CASE 2
Days = 28
IF Year MOD 4 = 0 THEN
IF Year MOD 100 = 0 THEN
IF Year MOD 400 = 0 THEN Days = 29
ELSE
Days = 29
END IF
END IF
END SELECT
FUNCTION = Days
END FUNCTION
Lösung von: Markus Sägesser (keine)
package Aufgaben.Sonntage;
public class Sundays {
public static void main(String[] args)
{
// Zählvariable für Wochentage, Steuervariable für eine Schleife und Zählvariable für Anzahl Sonntage
int wochentag = 0, tagmodifier = 0, anzahlSonntage = 0;
// iteriere über alle Jahre zwischen 1900 und 2000
for(int jahr = 1900; jahr < 2000; jahr++)
{
// iteriere über alle Monate des jeweiligen Jahres
for(int monat = 0; monat < 12; monat++)
{
// setze die Steuervariable zur Anpassung der Tage im Monat für die innere Schleife, basierend auf dem aktuellen Monat
switch (monat)
{
//30-tägige Monate: April, Juni, September und November
case 3:
case 5:
case 8:
case 10: tagmodifier = 1; break;
//Februar: 29 Tage im Schaltjahr, 28 sonst
case 1: tagmodifier = (jahr % 4 == 0) ? 2: 3; break;
// alle anderen Monate: modifier zurücksetzen
default: tagmodifier = 0; break;
}
// iteriere über alle Tage des aktuellen Monats
for(int tag = 0; tag < 31-tagmodifier; tag++ )
{
// wenn der Wochentag ein Sonntag ist und der Tag der erste des Monats ist...
if(wochentag % 7 == 6 && tag == 0)
{
//...zähle einen Sonntag drauf
anzahlSonntage++;
}
// zähle den Wochentag für die nächste Iteration der inneren Schleife hoch
wochentag++;
}
}
}
System.out.println("Anzahl Sonntage zwischen 1. Januar 1900 und 31. Dezember 2000: " + anzahlSonntage);
}
}
Lösung von: Name nicht veröffentlicht
'28.05.2017 - Powerbasic 10
'Mir war langweilig, daher noch Version 2 mit integrierten Datumsfunktionen
#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
DIM Jahr AS INTEGER
DIM Monat AS INTEGER
DIM Pruef AS IPOWERTIME
LET Pruef = CLASS "PowerTime"
DIM Sonntage AS INTEGER
FOR Jahr = 1901 TO 2000
FOR Monat = 1 TO 12
Pruef.NewDate(Jahr, Monat, 1)
IF Pruef.DayOfWeek = 0 THEN INCR Sonntage
NEXT Monat
NEXT Jahr
MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$
END FUNCTION
Lösung von: Markus Sägesser (keine)
using System;
namespace Sonntage
{
class Program
{
static void Main()
{
int amountOfRequestedSundays = 0;
// Define range. (Single line initialization is also possible.)
DateTime startDate = new DateTime(1901, 01, 01);
DateTime endDate = new DateTime(2000, 12, 31);
// Iterate through timespan.
while (startDate <= endDate)
{
// Check for first of month and day of week.
if (startDate.Day == 1 && startDate.DayOfWeek == DayOfWeek.Sunday)
{
// Increase counter if we have a hit.
amountOfRequestedSundays++;
}
// Go to the next day.
startDate = startDate.AddDays(1);
}
Console.WriteLine("Anzahl der Sonntage: {0}", amountOfRequestedSundays);
// 171
}
}
}
Lösung von: Manu Fx ()
'23.02.2018 - Powerbasic 10
''Die Sonntage beschäftigen mich mal immer wieder - diese Lösung benutzt Zellers Kongruenz zur Berechnung der Wochentage
#COMPILE EXE
#DIM ALL
FUNCTION PBMAIN () AS LONG
DIM Jahr AS INTEGER
DIM Monat AS INTEGER
DIM Sonntage AS INTEGER
FOR Jahr = 1901 TO 2000
FOR Monat = 1 TO 12
IF gregZeller(Jahr, Monat, 1) = 6 THEN INCR Sonntage
NEXT Monat
NEXT Jahr
MSGBOX STR$(Sonntage) & " Sonntage",,EXE.NAME$
END FUNCTION
'--------------------------------------------------
FUNCTION gregZeller(BYVAL y AS INTEGER, BYVAL m AS INTEGER, BYVAL d AS INTEGER) AS INTEGER
' gibt 0 für Mon bis 6 für Son zurück
IF m < 3 THEN
INCR m
INCR d
DECR y
END IF
FUNCTION = ((13*m+3)\5+d+y+y\4-y\100+y\400) MOD 7 '-> "\" anstelle von "/" -> Ganzzahldivision
END FUNCTION
Lösung von: Markus Sägesser (keine)
def isLeapYear(year):
if not (year % 400 or year % 100 or year % 4):
return True
if not (year % 4 or year % 100):
return False
if not year % 4:
return True
return False
monthsWith30 = {9, 4, 6, 11}
sundays = 0
day = 1
weekday = 0
month = 1
year = 1900
while True:
if month == 12 and day == 31:
year += 1
if year == 2001:
break
if month == 2:
if isLeapYear(year):
monthLenght = 29
else:
monthLenght = 28
elif month in monthsWith30:
monthLenght = 30
else:
monthLenght = 31
if day > monthLenght:
day = 0
month = 1 + (month % 12)
print (f"{day:02}:{month:02}:{year:04}, {weekday}")
if weekday == 6 and day == 1:
sundays += 1
day += 1
weekday = (weekday + 1) % 7
print (sundays)
Lösung von: Osh Gnacknak ()
let sundays = 0;
for (let y = 1900; y < 2000; y++)
for (let m = 0; m < 11; m++)
if (new Date(y, m, 1).getDay() == 0) sundays++;
console.log(sundays);
Lösung von: Lisa Salander (Heidi-Klum-Gymnasium Bottrop)
// NET Core 3.x; C# 8.x
using System;
namespace CS_Aufgabe_Sonntage
{
class Program
{
static void Main(string[] args)
{
var sDate = new DateTime(1901, 01, 01);
var eDate = new DateTime(2000, 12, 31);
var counter = 0;
// erster Sonntag ab Startdatum => schnellere Schleife (Faktor 6)
var fDate = sDate.AddDays(7 * (Math.Sign((int)sDate.DayOfWeek) - 1) - (int)sDate.DayOfWeek);
while (fDate < eDate)
{
if (fDate.Day == 1) counter++;
fDate = fDate.AddDays(7);
}
Console.WriteLine($"Anzahl Sonntage: {counter}");
}
}
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20
#include <iostream>
#include <boost/date_time/gregorian/gregorian.hpp>
using namespace boost::gregorian;
auto get_sundays_on_first(date begin, date end) {
const auto sgn = []<typename T>(T val) { return (T(0) < val) - (val < T(0)); }; // C++ 20!
auto counter{ 0 };
constexpr days add_seven{ 7 };
const days first_day{ 7 * (sgn(begin.day_of_week().as_number()) - 1) - begin.day_of_week().as_number() };
begin += first_day;
while (begin < end) {
if (begin.day() == 1) counter++;
begin += add_seven;
}
return counter;
}
int main() {
const auto s{ get_sundays_on_first({1901, 1, 1}, {2000, 12, 31}) };
std::cout << "Anzahl Sonntage: " << s << "\n";
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
#include <iostream>
#include <chrono>
#include <format>
using namespace std::chrono;
using ymwd = year_month_weekday;
using ymd = year_month_day;
constexpr auto get_sundays_1st(const ymd& begin_, const ymd& end_) {
const ymwd ymwd_begin{ Sunday[1] / begin_.month() / begin_.year() };
const auto sd_end{ sys_days{ end_} };
auto sd_begin = sys_days{ ymwd_begin };
std::vector<ymd>out;
while (sd_begin <= sd_end) {
ymd ymd_date{ sd_begin };
if (ymd_date.day() == day{ 1 })
out.push_back(ymd_date);
sd_begin += days(7);
}
return out;
}
const auto& operator<<(std::ostream& os_, const ymd& ymd_) {
static auto i{ 0 };
os_ << std::format("{:02}: {}, {}.{:02}.{}\n",
++i, ymwd{ ymd_ }.weekday(), ymd_.day(), unsigned(ymd_.month()), ymd_.year());
return os_;
}
int main() {
constexpr ymd begin{ 2018y / 1 / 1 };
constexpr ymd end{ 2023y / 12 / 31 };
const auto sundays{ get_sundays_1st(begin, end) };
std::cout << std::format("Anzahl Sonntage: {}\n", sundays.size());
for (const auto& sunday : sundays)
std::cout << sunday;
}
Lösung von: Jens Kelm (@JKooP)
// C++ 20 | VS-2022
// extrem schnell, da nur die 1. Sonntage im Monat geprüft werden
#include <iostream>
#include <chrono>
#include <format>
using namespace std::chrono;
using ymd = year_month_day;
using ymwd = year_month_weekday;
struct span {
int begin, end;
};
constexpr auto get_sundays_1st(const span& span_) {
std::vector<ymd>out;
for (auto y{ span_.begin }; y <= span_.end; ++y) {
for (auto m{ 1 }; m <= 12; ++m) {
const ymwd ymwd_date{ Sunday[1] / m / y };
const ymd ymd_date{ ymwd_date };
if (ymd_date.day() == day{ 1 })
out.push_back(ymd_date);
}
}
return out;
}
const auto& operator<<(std::ostream& os_, const ymd& ymd_) {
static auto i{ 0 };
os_ << std::format("{:02}: {}, {}.{:02}.{}\n",
++i, ymwd{ ymd_ }.weekday(), ymd_.day(), unsigned(ymd_.month()), ymd_.year());
return os_;
}
int main() {
constexpr span sp{ 2018, 2023 };
const auto sundays{ get_sundays_1st(sp) };
std::cout << std::format("Anzahl Sonntage: {}\n", sundays.size());
for (const auto& sunday : sundays)
std::cout << sunday;
}
Lösung von: Jens Kelm (@JKooP)
' VBA
Function GetSundaysFirst(yr_begin%, yr_end%)
Dim c%
For yr% = yr_begin To yr_end
For mo% = 1 To 12
If Weekday(DateSerial(yr, mo, 1)) = 1 Then c = c + 1
Next mo
Next yr
GetSundaysFirst = c
End Function
Sub Main()
Debug.Print "Anzahl Sonntage:", GetSundaysFirst(1901, 2000)
End Sub
Lösung von: Jens Kelm (@JKooP)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int get_weekday(int year, int month, int day){
struct tm time_;
time_.tm_year = year - 1900;
time_.tm_mon = month - 1;
time_.tm_mday = day;
time_.tm_hour = 0;
time_.tm_min = 0;
time_.tm_sec = 1;
time_.tm_isdst = -1;
mktime(&time_);
return time_.tm_wday;
};
void get_sundays_1(int begin, int end) {
size_t i = 0;
for (int y = begin; y <= end; ++y)
for (int m = 1; m <= 12; ++m)
if (get_weekday(y, m, 1) == 0)
printf("(%03d) %02d.%02d.%04d\n", ++i, 1, m, y);
}
int main() {
get_sundays_1(2000, 2024);
return 0;
}
Lösung von: Jens Kelm (@JKooP)
// NET 8.x | C# 12.x | VS-2022
var begin = 1901;
var end = 2000;
var counter = 0;
for(var y = begin; y <= end; y++)
for(var m = 1; m <= 12; m++)
if(new DateOnly(y, m, 1).DayOfWeek == DayOfWeek.Sunday)
counter++;
Console.WriteLine($"Anzahl Sonntage: {counter}");
Lösung von: Jens Kelm (@JKooP)
// NET 8.x | C# 12.x | VS-2022
var begin = 1900;
var end = 2000;
var sundays = Enumerable.Range(begin, end - begin)
.SelectMany(y => Enumerable.Range(1, 12)
.Select(m => (year: y, month: m)))
.Select(x => new { dt = new DateTime(x.year, x.month, 1) })
.Where(x => x.dt.DayOfWeek == 0).ToList();
Console.WriteLine($"Anzahl Sonntage: {sundays.Count}\n");
sundays.ForEach(x => Console.WriteLine(x.dt.ToShortDateString()));
Lösung von: Jens Kelm (@JKooP)
Aktionen
Neue Lösung hinzufügen
Bewertung
Durchschnittliche Bewertung:
Kommentare (1)