Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » k Teiler für 1<=n<=1000

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
15.10.2016, 13:01 Uhr
Jojolino57



Ich muss folgende Aufgabe lösen:
Write a program that lists all numbers between 1 and 1000 (including 1 and 1000) that have k divisors for an input number k. (Schreibe ein Programm, welches alle Zahlen zwischen 1 und 1'000 (1 und 1'000 inbegriffen), die k Teiler für eine eingegebene Zahl k haben.
Als Code habe ich vorläufig das folgende (Ich compiliere auf codeboard.io und es gibt ein miteinbegriffenes Testprogramm für jede Übung und mein Code stimmt nur für k=1, jedoch nicht für k=5, k=32 oder k=20.):

C++:
#include "tests.h" // remove slashes at beginning of line to test or submit
#include <iostream>
int main ()
{
    int a, b, k, number;
    a, number=0;
    b=1;
    do
    {
        std::cin>>k;
    }
        while (k<=0 || k>1000);
    do
    {
        ++a;
        if (b%a==0)
        {
            ++number;
            if (number=k)
                {
                    std::cout<<b;
                    ++b;
                }
            if (b=1000) break;
        }
        else
        {
            continue;
        }
        if (a=1000)
        {
            a=0;
            ++b;
        }
    }
        while (a<=1000);
    return 0;
}



-----
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 17.10.2016 um 17:58 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.10.2016, 18:46 Uhr
~Jojolino57
Gast


Der Grund warum mein Code nicht geht ist, dass ich nicht verstanden habe wie man herausfinden kann (schriftlich), welche Zahl eine bestimmte Anzahl Teiler hat.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.10.2016, 19:07 Uhr
Jojolino57



Sorry, war nicht eingeloggt, denn ich war das auch beim vorherigen Post.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.10.2016, 18:03 Uhr
Hans
Library Walker
(Operator)


Hi,


Zitat von ~Jojolino57:
Der Grund warum mein Code nicht geht ist, dass ich nicht verstanden habe wie man herausfinden kann (schriftlich), welche Zahl eine bestimmte Anzahl Teiler hat.

D.h. Du hast die Mathematik dahinter nicht verstanden?! - Dann solltest Du mal ein paar Mathebücher konsultieren, wo das Problem und seine Lösung drin beschrieben steht.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.10.2016, 18:08 Uhr
Hans
Library Walker
(Operator)


noch mal Hi,

dann sind da ein paar Fehler im Quelltext. Hab die mal mit Kommentaren versehen:


C++:
#include "tests.h" // remove slashes at beginning of line to test or submit
#include <iostream>
int main ()
{
    int a, b, k, number;
    a, number=0;
    b=1;
    do
    {
        std::cin>>k;
    }
        while (k<=0 || k>1000);
    do
    {
        ++a;
        if (b%a==0)
        {
            ++number;
            if (number=k)   // Fehler: Zuweisung! - ist immer wahr.
                {
                    std::cout<<b;
                    ++b;
                }
            if (b=1000) break;   // Fehler: Zuweisung! - ist immer wahr.
        }
        else
        {
            continue;
        }
        if (a=1000)   // und zum 3. mal eine Zuweisung in der if-Abfrage
        {
            a=0;
            ++b;
        }
    }
        while (a<=1000);
    return 0;
}



Ob das Problem damit gelöst ist, hab ich nicht überprüft, sondern nur mal kurz den Quelltext überflogen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 17.10.2016 um 18:09 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2016, 08:22 Uhr
Tommix



'Morgen,

C++:
a, number=0;


Macht auch nicht, was es soll.

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.10.2016, 17:05 Uhr
Hans
Library Walker
(Operator)



Zitat von Tommix:
'Morgen,

C++:
a, number=0;


Macht auch nicht, was es soll.

- Tommix

Stimmt.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.10.2016, 10:52 Uhr
Jojolino57



Ich habe es anders probiert, aber es geht auch so nicht.
// Informatik - Serie 4 - Aufgabe 3
// Programm: kdivisors.cpp
// Autor: Joël Andenmatten (Gruppe F)


C++:
#include "tests.h" // remove slashes at beginning of line to test or submit
#include <iostream>
int main ()
{
    int k, test;
    int a=0;
    do
    {
        std::cin>>k;
    }
        while (k<0 || k>1000);
        for (int i=1; i<=1000; ++i)
        {
            for (int j=1; j<=1000; ++j)
            {
                if (i%j==0)
                {
                    ++a;
                }
            }
        if (a==k)
        {
            std::cout<<i<<" ";
        }
        a=0;
    }
    return 0;
}



-----
Edit: cpp-Tags eingefügt.

Dieser Post wurde am 19.10.2016 um 16:26 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.10.2016, 13:08 Uhr
ao

(Operator)


Also, vorausgesetzt, ich habe die Aufgabe richtig verstanden, tut das hier das, was es soll.

Ich habe nichts verändert außer
* Ersetzung der nichtssagenden Bezeichner a, i, j und k durch sprechende Namen.
* Einführung eines konstanten Symbols für die 1000.
* Einführung einiger Kontroll-Ausgaben (alles, was mit std::cerr anfängt)
* Auskommentieren von #include "tests.h" ("no such file or directory")

Im Prinzip müsste dein Programm also richtig sein. Was funktioniert denn noch nicht?

Hier ist mein Code:

C++:
//#include "tests.h" // remove slashes at beginning of line to test or submit
#include <iostream>
int main ()
{
    int numDivisorsWanted, test;
    int numDivisors=0;
    const int MAX_NUM = 1000;
    do
    {
        std::cin>>numDivisorsWanted;
    }
    while (numDivisorsWanted<0 || numDivisorsWanted>MAX_NUM);
    {
        for (int dividend=1; dividend<=MAX_NUM; ++dividend)
        {
            std::cerr << "dividend = " << dividend << " divisors =";
            for (int divisor=1; divisor<=MAX_NUM; ++divisor)
            {
                if (dividend%divisor==0)
                {
                    std::cerr << " " << divisor;
                    ++numDivisors;
                }
            }
            std::cerr << " (" << numDivisors << ")" << std::endl;
            if (numDivisors==numDivisorsWanted)
            {
                std::cout << dividend << " has " << numDivisorsWanted << " divisors." << std::endl;
            }
            numDivisors=0;
        }
    }
    return 0;
}


Dieser Post wurde am 19.10.2016 um 13:21 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
19.10.2016, 13:50 Uhr
ao

(Operator)


Da das eine Übungsaufgabe für Anfänger ist, kommt hier noch ein bisschen allgemeine Manöverkritik:

Das ist ein kurzes und simples Programm, das aber durch die Verwendung von nichtssagenden Variablennamen (a, i, j, k) erstaunlich unübersichtlich wird. Wie dieses Programm arbeitet, das erschließt sich erst bei ganz genauer Lektüre des Quellcodes: Zwei geschachtelte Schleifen, eine Division, wenn die ohne Rest aufgeht, eine Variable erhöhen ... aha ...

Ich weiß, das k steht so im Aufgabentext. Ich kenne auch die Gewohnheit, Schleifenzähler i und j zu nennen. Wenn es sich wirklich nur um Schleifenzähler handelt, spricht auch nichts dagegen.

In deinem Fall ist aber i der Dividend und j der Divisor einer Rechenoperation, a hält die Anzahl der Teiler und k ist der Zielwert. Um dein Programm allgemein verständlich zu machen, müsstest du diese Informationen in Kommentare schreiben.

Aber wenn du drüber nachdenkst, Kommentare zu verfassen, die die Bedeutungen der Variablen erklären, kannst du auch gleich über bessere Namen nachdenken.

Fang nicht blind an, irgendwas in den Computer zu hacken. Mach dir zuerst kurz Gedanken darüber, welche Daten du speichern musst, und gib ihnen treffende Namen. Dadurch werden alle Schritte, die das Programm macht, auf einmal selbsterklärend. Du wirst staunen, wie gut du dich selber in deinem Code zurechtfindest, und deine Leser werden dir jubelnd zu Füßen liegen

Das ist auch nicht mehr Schreibarbeit. Jeder halbwegs moderne Editor (geany, eclipse, Visual Studio) kann Autocompletion und bietet dir, wenn du anfängst, einen Namen zu tippen, die in Frage kommenden Symbole zur Auswahl an.

Zum Abschluss noch ein Wort zu der Konstanten 1000: Die kommt in deinem Quelltext dreimal vor, und immer in derselben Bedeutung. Wenn du dein Programm nun dazu bringen willst, bis 10.000 zu prüfen, musst du es an drei Stellen ändern. Hier geht das noch, aber wenn die Programme länger werden, wird das eine üble Sucherei. Vor allem, wenn du nicht mehr weißt, ob die 1.000 in allen Fällen die Bedeutung des Endwerts hat, oder ob es nicht an irgendeiner Stelle doch nur die Schuhgröße ist. Sowas wird sehr schnell völlig unwartbar.

Leg an einer Stelle eine Variable an, die die 1000 enthält, und verwende im Code nur diese Variable. Das verbessert die Lesbarkeit, weil man sofort sieht, womit hier eigentlich gearbeitet wird (aha, die Maximalzahl, mit der geprüft werden soll) - Zahlenwerte über den Code verstreut sagen nämlich gar nichts aus über die Bedeutung der Zahlen. Und es verbessert die Pflegbarkeit: An einer einzigen Stelle die 1.000 durch was anderes ersetzen, und das Programm läuft in identischer Weise bis eine Million oder noch mehr. Oder für einen schnellen Test nur bis 100.

Dieser Post wurde am 19.10.2016 um 13:55 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: