Znajdź najmniejszą liczbę 3-cyfrową, której suma cyfr równa jest 9, a różnica równa jest 5.

0

Witam mam napisać program jak w temacie.Tylko ze jest problem.Nie wiem jak wylosować liczbę 3-cyfrową.

#include <cstdlib>
#include <iostream>

using namespace std;

int wybor;
void menu()
     {
      cout<<"Znajdywanie liczby wersja 1.0, Autor: Anonim 2011"<<endl; 
      cout<<""<<endl;
      cout<<"MENU:"<<endl;      
      cout<<"[1] Znajdz najmniejsza liczbe 3-cyfrowa, ktorej suma cyfr rowna jest 9, a roznica rowna jest 5."<<endl;
      cout<<"[2] Koniec programu"<<endl;
      cin>>wybor;
     }
void zad()
     {
      int a,b,c,suma,roznica;
       
\\nie wiem co tutaj zrobic 

      a+b+c==suma;
      a-b-c==roznica; 
              if((suma)==9&&(roznica)==5)      
              cout<<"Najmniejsza liczba 3-cyfrowa,ktorej suma cyfr wynosi 9,a roznica 5 to:"<<suma<<endl;
     }

int main(void)
{
 menu();
 switch(wybor)
              {
               case 1:
                    zad();
                    system("PAUSE");
               break;
               case 2:
                    exit;
               break; 
               default:
                       cout<<"Mozna wybrac tylko 1 lub 2."<<endl;
                       system("PAUSE");                
              }
    return 0;
}
0

Ale czemu losować? Masz iterować od 0 do 999 i jeśli znajdziesz liczbę to break (albo ewentualnie return).

0

Możesz napisać jakiś przykład jakby to miało wyglądać?

0

A może zdradzisz, co to jest różnica cyfr dla liczby trzycyfrowej? Np. dla 745?

0
bogdans napisał(a)

A może zdradzisz, co to jest różnica cyfr dla liczby trzycyfrowej? Np. dla 745?

chodzi o to ze program ma mi wyswietlic najmniejsza mozliwa liczbe 3 cyfrowa ktorej suma cyfr rowna jest 9 a roznica 5.

liczba 745 jej suma to 7+4+5=16
liczba 745 jej roznica to 7-4-5=-2

a ja musze wyswietlic tak liczbe ktorej a+b+c=9 i jednoczesnie a-b-c=5

0

no to lecisz od 100 do 999 i sprawdzasz podane przez Ciebie warunki.

0

@bogdans autor zadania.

0
Grant Vaders napisał(a)

no to lecisz od 100 do 999 i sprawdzasz warunki podane przez Ciebie warunki.

ale jak z wylosowanej liczby z przedzialu od 100 -999 odzielis cyfry tak zeby sprawdzic czy ich suma to 9 i roznica 5?

0

Ale Ty nie musisz losować, Ty masz znaleźć najmniejszą. Która pętla może Ci się przydać ?

0
Grant Vaders napisał(a)

Ale Ty nie musisz losować, Ty masz znaleźć najmniejszą. Która pętla może Ci się przydać ?

Ale jak mam ją znalezc?

A jak juz ja znajde to jak ja rozlozycz zeby sprawdzicz czy suma cyfr to 9 a roznica to 5?

0

Dodam ze jestm poczatkujacym i nie zabardzo wiem jak mam to zrobic .

0

Nie musisz znajdować "całej" liczby, po prostu zrób trzy pętle, każda z nich odpowiednio jest odpowiedzialna za iterowanie po cyfrach setek, dziesiątek, jedności. Tylko pamiętaj, że jeśli masz liczbę trzy-cyfrową to musisz setkę iterować od 1. A jedności i dziesiątki od 0 do 9.

i później odpowiednio cyfry: setek+dziesiątek + jedności == 9 i drugi warunek == 5 to zwracasz odpowiedni string w którym masz te cyferki obok siebie, wygląda wtedy jak normalna liczba ;p

1
#include <cstdlib>
#include <iostream>
using namespace std;

      int check_digit(int x)
      {
        int s = x /100;  // cyfra setek to liczba podzielona przez 100    /- operator dzielenia
        int j = x % 10;  // jednosci  to reszta z dzielenia liczby przez 10    % operator reszty z dzielenia
        int d = (x- s*100 - j)/10;   // dziesiatki to liczba - (cyferka setek * 100 - jednosci) / 10

        if ((s+d+j == 9 ) && (s-d-j==5)) return 1 ;  // dodaje jednosci dziesiatki i setki albo odejmuje 
//operator && to logiczne ^
        return 0;
      }
      
int main()
{
      
for (int x=100 ; x<1000 ; x++)
{

    if (check_digit(x))     //funkcja check digit da 1 jesli warunek jest spelniony
    {
      cout <<x;  //cout wwypisuje x
      break;  //break przerywa petle
    }
}
    system("PAUSE");
    return EXIT_SUCCESS;
}

jesli w funkcji wywola sie return funkcja zwraca wartosc i konczy dzialanie
wiec jesli masz liczbe prawidlowa funkcja zwraca 1
jak nie prawidlowa pezechodzi nizej i zwraca 0
w C/C++ kazda wartosc inna od 0 to logiczne prawda

0
Piotrekdp napisał(a)
#include <cstdlib>
#include <iostream>
using namespace std;

      int check_digit(int x)
      {
        int s = x /100;
        int j = x % 10;
        int d = (x- s*100 - j)/10;

        if ((s+d+j == 9 ) && (s-d-j==5)) return 1 ;
        return 0;
      }
      
int main()
{
      
for (int x=100 ; x<1000 ; x++)
{

    if (check_digit(x))  
    {
      cout <<x;
      break;
    }
}
    system("PAUSE");
    return EXIT_SUCCESS;
}

Byl bym jeszcze wdzieczny gdybys wytlumaczyl mi o co w tym chodzi

0

to chyba jasne, s - setki, d - dziesiatki, j - jedności

x % 10 da Ci ostatnią cyfrę z liczby 3-cyfrowej czyli cyfra jedności.
x / 100 da Ci pierwszą cyfrę z 3-cyfrowej liczby czyli cyfrę setek
(x- s*100 - j)/10; da Ci drugą cyfrę z 3-cyfrowej liczby czyli cyfrę dziesiątek.

z liczby np: 543
s = 5
j = 3
d = 4

następnie sprawdzany jest warunek
if ((s+d+j == 9 ) && (s-d-j==5))
jak zwróci 1 to w głównej pętli programu nastepuje ** cout << x;** oraz break;
jeśli pętla zwróci 0 to kolejna z kolei liczba trafaia do tego "check_digit";

0

Najłatwiej chyba będzie zrobić 3 zmienne np a, b, oraz c przypisujesz do nich początkowo 1 0 oraz 0, i teraz zwiększasz c o 1, sprawdzasz czy a + b + c równa się 9 oraz czy a - b- c jest równe 5, jak nie to sprawdzasz wartość a jeśli mniejsze od 9 to znowu zwiększasz o jeden a jak równe to ustawiasz na zero i sprawdzasz b (zmiany analogiczne jak przy c i b)jak a dojdzie do 9 i przyjdzie ci je zwiększyć to zadanie nie ma rozwiązania

0

mozna tez tak:

#include <cstdlib>
#include <iostream>
using namespace std;

      
int main()
{
for (int s=1; s<10 ; s++)
for (int d=0; d<10 ; d++) 
for (int j=0; j<10 ; j++) 
if ((s+d+j == 9 ) && (s-d-j==5)) 
{
cout <<s<<d<<j<<endl;
goto koniec;
}
koniec:

    system("PAUSE");
    return EXIT_SUCCESS;
}
 

goto jest znienawdzoną niebezpieczna instrukcją jednak przy wielu zagniezdzeniach jej uzycie mozna wybaczyc:P

0

Rozwiązanie krótsze: Cały czas zachowuję warunek (a + b + c == 9) i szukam liczby spełniającej drugi warunek.

#include <cstdio>

int main() {
    int a = 1;
    int b = 0;
    int c = 8;
    while (a - b - c != 5) {
        b++;
        if (a + b > 9) {
            a++;
            b = 0;
        }
        c = 9 - a - b;
    }
    printf("%d\n", 100 * a + 10 * b + c);
}

Albo inaczej. Cały czas zachowuję warunek (a - b - c == 5) i szukam liczby spełniającej drugi warunek.

#include <cstdio>

int main() {
    int a = 5;
    int b = 0;
    int c = 0;
    while (a + b + c != 9) {
        b++;
        if (a - b < 0) {
            a++;
            b = 0;
        }
        c = a - b - 5;
    }
    printf("%d\n", 100 * a + 10 * b + c);
}

A tak w ogóle z tego, że (a + b + c == 9) i (a - b - c == 5) wynika, że a == 7. Dodając do tego warunek, że a, b i c zawierają się w {0, ..., 9}, a mamy wyszukać najmniejszą liczbę spełniającą warunki dostajemy b == 0 - tzn pierwsze dwa warunki wymuszają tylko wartości zmiennej a oraz sumy b + c, więc b można i trzeba ustawić na 0. Mając a i b liczymy c == 2 i mamy wynik zadania :]

0
#include <cstdlib>
#include <iostream>
using namespace std;

      
int main()
{
bool znaleziono =false;

     for (int s=1; s<10 ; s++)
     {
      if (znaleziono) break;
         for (int d=0; d<10 ; d++)
         { 
           if (znaleziono) break;
              for (int j=0; j<10 ; j++) 
              {
               if ((s+d+j == 9 ) && (s-d-j==5)) 
                  {
                   cout <<s<<d<<j<<endl;
                   znaleziono=true;
                   break;
                   }
               }
        }
     }

    system("PAUSE");
    return EXIT_SUCCESS;
}


bez goto

bez goto z warunkiem w petli

#include <cstdlib>
#include <iostream>
using namespace std;

      
int main()
{
bool znaleziono =false;

     for (int s=1; s<10 && !znaleziono; s++)
     {
    
         for (int d=0; d<10 && !znaleziono; d++)
         { 
         
              for (int j=0; j<10 ; j++) 
              {
               if ((s+d+j == 9 ) && (s-d-j==5)) 
                  {
                   cout <<s<<d<<j<<endl;
                    znaleziono =true;
                   break;
                   }
               }
        }
     }

    system("PAUSE");
    return EXIT_SUCCESS;
}
0

@Piotrekdp:

Powinno być:

for (int s=1; s < 10 ; s++)
for (int d=0, hi1=10-s; d < hi1 ; d++) 
for (int j=0, hi2=10-d-s; j < hi2 ; j++) 

W ten sposób każdy krok pętli j ma poprawną liczbę ze względu na warunek pierwszy.
Do tego dołożyłbym pomysł Wibowita ("i szukam liczby spełniającej drugi warunek") i gotowe.

Wersja bez goto, za to ze zwróceniem wyniku poza pętlę:

bool found=false;
int wynik[3];
for (int s=1; (s < 10) && !found; s++)
for (int d=0, hi1=10-s; (d < hi1) && !found ; d++) 
for (int j=0, hi2=10-d-s; (j < hi2) && !found ; j++) 
  if (s - d - j == 5) {
    wynik[0] = s; wynik[1] = d; wynik[2] = j; 
    found = true;
  }
0

no tak ale to szkolne zadanie równie dobrze można obliczyć analitycznie :>
i dać program co wypluje wynik równania - juz nie przesadzajmy ;D

0

Zrobilem tak jak powinno to wygladac do szkoly:

 
#include <cstdlib>
#include <iostream>

using namespace std;

int wybor;
void menu()
{
 cout << "Znajdywanie liczby wersja 1.0, Autor: ******* xD 2011"<< endl; 
 cout << ""<< endl;
 cout << "MENU:"<< endl;      
 cout << "[1] Znajdz liczbe."<< endl;
 cout << "[2] Koniec programu"<< endl;
 cin >> wybor;
}
void zad()
{        
for (int x=100 ; x<1000 ; x++) // losuje liczby z przedzialu od 100 - 1000
	{
		int s = x /100;  //liczba setek
		int j = x % 10;  //liczba jednosci 
		int d = (x- s*100 - j)/10; //liczba dziesatek
		
		    if ((s+d+j == 9 ) && (s-d-j==5)) //sprawdza warunek zadania
			   {
		               cout <<"Najmniejsza liczba 3-cyfrowa, ktorej suma cyfr wynosi 9, a roznica 5 to:"<<s<<d<<j<<endl;
				       break; // przerywa petle
			   }
	}
}

int main(void)
{
 menu();
 switch(wybor)
              {
                case 1:
                zad();
                system("PAUSE");
                break;
                case 2:
                break; 
                default:
                cout<<"Mozna wybrac tylko 1 lub 2."<<endl;
                system("PAUSE");                
              }
 return 0;
}

Wzorowałem się na pierwszym kodzie który podał Piotrekdp za co mu serdecznie dziękuję ;)

Ale szukałem bardziej dla mnie zrozumiałego sposobu bo nie za bardzo rozumiem to:

 int s = x /100; 
int j = x % 10;   
int d = (x- s*100 - j)/10; 

I jak nauczyciel się mnie zapyta o co w tym chodzi nie za bardzo będę umiał mu wytłmaczyć :P

0

Kolejne podejście - rekurencja ogonowa.

#include <cstdio>

bool find(int a, int b, int c) {
    if ((a + b + c == 9) && (a - b - c == 5)) {
        printf("%d\n", 100 * a + 10 * b + c);
        return true;
    } else if (c < 9) {
        return find(a, b, c + 1);
    } else if (b < 9) {
        return find(a, b + 1, 0);
    } else if (a < 9) {
        return find(a + 1, 0, 0);
    }
    return false;
}

int main() {
    find(1, 0, 0);
}
#include <cstdio>

void find(int a, int b, int c) {
    if ((a + b + c == 9) && (a - b - c == 5)) {
        printf("%d\n", 100 * a + 10 * b + c);
    } else if (c < 9) {
        find(a, b, c + 1);
    } else if (b < 9) {
        find(a, b + 1, 0);
    } else if (a < 9) {
        find(a + 1, 0, 0);
    }
}

int main() {
    find(1, 0, 0);
}

Ewentualnie kaskada ifów:

#include <cstdio>

int main() {
    int a = 1;
    int b = 0;
    int c = 0;
    while ((a - b - c != 5) || (a + b + c != 9)) {
        c++;
        if (c == 10) {
            c = 0;
            b++;
            if (b == 10) {
                b = 0;
                a++;
            }
        }
    }
    if (a != 10) {
        printf("%d\n", 100 * a + 10 * b + c);
    }
}
1

dla 145 mamy:
s= 145 /100 ;
s=1 bo / jest dzieleniem 2 liczb całkowitych i da liczbe całkowitą.
j = 145 % 10;
% 10 to reszta z dzielenia przez 10 mamy 14 "dziesiatek" i 5 reszty.

dziesiatki to 145 - s100 -j = 145 - 1100 -5 = 145 - 105 =40
i teraz dzielimy na 10
mamy 4

dla scisłości
liczba %666 da wynik reszty z dzielenia przez 666;

0

Mam pytanie nie dotyczące tematu ale dotyczące c++ :D

#include <cstdlib>
#include <iostream>
using namespace std;
int main(void)
{
int n;
cout<<"Podaj wysokosc choinki!!! ""\n";     // Zapytanie do u?ytkownika
cin >> n;                               //pobranie wartooci ilooci pieter
cout << endl;
int i,j,x,a;                              //deklaracja zmiennych
for (i=1; i<=n; i++)                    //petla
{
for (j=1; j<=n-i; j++)                  //petla
{
cout <<" ";
}
cout << "/";                            // lewa czeoa choinki
for (j=1; j<=i*2-2; j++)                //petla

{
cout <<" ";
}
cout << "\\";                           //prawa czeoa choinki
{


}
cout << endl;
}
a = (n-1);
cout <<"||"<<endl;
cout << "Oto twoja choinka :D"<<endl;
system("PAUSE");                        //pauza
return 0;                               //koniec
}
 

Jak zrobic zeby a to byly spacje chodzi mi o te , ze jak n to 5 to beda 4 spacje i dopiero "||"

1

no sam sobie odpowiedziales - wstawic spacje w petli

for (i=1; i<=n -1; i++) cout <<" "; //spacje
cout <<"||"<<endl;

1 użytkowników online, w tym zalogowanych: 0, gości: 1