Matura informatyka

0

Witam!
Interesuje mnie jak by wyglądały przykladowe rozwiązania zadań matutralnych z matury próbnej 2009.

Zadanie 5. Liczby półpierwsze (8 pkt)
Liczbami półpierwszymi nazywamy liczby, które są iloczynem dwu liczb pierwszych.
Przykład:
34 jest liczbą półpierwszą, ponieważ 34 = 2 * 17
95 jest liczbą półpierwszą, ponieważ 95 = 5 * 19
699 jest liczbą półpierwszą, ponieważ 699 = 3 * 233
841 jest liczbą półpierwszą, ponieważ 841 = 29 * 29
Wykonaj poniższe polecenia:
a) Sprawdź, czy poniższe liczby są półpierwsze. Dla tych które są, wpisz ich rozkład na czynniki pierwsze, dla pozostałych wpisz słowo „NIE”.
65
851
1 002
44 521
b) W pliku liczby.txt umieszczono w kolejnych wierszach 500 całkowitych liczb dodatnich, z których każda ma co najwyżej 6 cyfr. Napisz program, za pomocą którego otrzymasz wszystkie liczby półpierwsze z pliku liczby.txt. Otrzymane wyniki zapisz w pliku zadanie5.txt. Przy ocenie Twojego programu będą przyznawane punkty za złożoność zastosowanego przez Ciebie algorytmu.

Zadanie 4. Lotto (12 pkt)
W pliku lotto.txt umieszczono wyniki 522 losowań Dużego Lotka (od dnia 1 stycznia 2000 roku do dnia 29 grudnia 2004 roku). W każdym wierszu znajduje się data losowania a po niej 6 wylosowanych tego dnia liczb. Data i liczby są pooddzielane od siebie odstępami. Liczby są liczbami całkowitymi z zakresu od 1 do 49 i są podane w kolejności rosnącej.
Przykład:
2000-01-01 9 19 22 23 34 39
2000-01-05 3 5 13 23 41 42
2000-01-08 4 6 26 27 42 49
2000-01-12 4 22 36 39 41 45
Wykonaj poniższe polecenia:
a) Podaj, ile razy wylosowano liczbę 13.
b) Spośród wszystkich losowań wyznacz i podaj minimalną sumę wylosowanych liczb wraz z datą dowolnego losowania o tej sumie.
c) Spośród wszystkich losowań wyznacz i podaj maksymalną sumę wylosowanych liczb wraz z datą dowolnego losowania o tej sumie.
d) Utwórz zestawienie zawierające następujące informacje: ile wylosowano liczb z każdego z następujących przedziałów: [1,9], [10, 19], [20, 29], [30, 39], [40, 49]. Wykonaj wykres prezentujący rozkład procentowy otrzymanych wyników. Pamiętaj o prawidłowym i czytelnym opisie wykresu.

0

tu chyba nic innego niż brute nie da rady, czyli : bierzesz liczbę z pliku i próbujesz ją dzielić przez kolejne liczby pierwsze (szukanie liczb pierwszych to trywialny algorytm, który pojawia się na forum codziennie więc nie będe sie tu nad nim rozwodził), jeśli liczba%pierwsza==0 to dzielisz je przez siebie i sprawdzasz czy wynik jest liczbą pierwszą (analogicznie jak szukajac liczby pierwszej).
4.
a) Tu chyba nic lepszego nie wymyslisz niż liniowe przejście przez wyniki i inkrementacje licznika jak trafisz na 13. (no chyba że koniecznie chcesz nie sprawdzać tego warunku przy każdej wylosowanej liczbie, wtedy robisz coś na bazie countingsorta: tworzysz tablicę int tab[49] i po wczytaniu każdej liczby robisz

tab[liczba-1]++;

a na koniec wypisujesz tab[12];
b)Tu znów bez magii: liczysz sumę dla 1 serii wyników i wpisujesz do int minimalnasuma i dodatkowo zapamiętujesz jaka to była data, a nastepnie idziesz sobie for() przez kolejne serie i je sumujesz. Jeśli aktualnie zsumowana seria dała sumę mniejszą niż to co masz w zmiennej, to wpisujesz do zmiennej nową sumę i zapamiętujesz jej datę.
c) analogicznie tylko bierzesz max ;] czyli coś w stylu

int maxsuma=0;
string data;
for(int i=0;i<522;i++)
{
//wczytujesz sobie dane, date do string dat, a serie np. do tablicy tablicawynikowdanejwserii[6];
  int chwsuma=0; //suma aktualnie sumowanej serii
  for(int j=0;j<6;j++)
    chwsuma+=tablicawynikowdanejserii[j];
  if(sumach>maxsuma)
    {
       maxsuma=sumach;
       data=dat;
    }
}

d) tu znów liniowo idziesz przez tablicę i zliczasz sobie, nie ma w tym nic skomplikowanego

0

Możesz też rozłożyć te liczby na czynniki pierwsze... Zauważ , że liczba półpierwsza ma tylko i wyłącznie dwa czynniki pierwsze więc sprawa wydaję się już prostsza... A to zadanie z excela to banał... Chyba nie są Ci potrzebne odpowiedzi???

0

Masz tu kod. W tym zadaniu wystarczyło rozłożyć liczby na czynniki pierwsze... Cała filozofia

#include <iostream.h>
#include <cmath>
#include <conio.h>
#include <fstream.h>

main()

{
      bool td[500];
      
       int i=0,liczby[500],s=0;
    ifstream  odczyt("liczby.txt");
    {
        while(!odczyt.eof())
        {
            odczyt>>liczby[i];
            i++;   
        }
    }
    
for(int r=0;r<=500;r++)
{    
    
  int n=liczby[r];
  int licznik=0;

    if (n > 1) 

    {
        int i = 2; 
         while (i <= sqrt(n))

         {
      
           while (n % i == 0)

            {
              licznik++;
              n /= i; 
              s=i;
            }

            if (n == 1) break;
           
            i++;

         }

    }
    if(licznik==1 || s*s==liczby[r])
    td[r]=true;
    else
    td[r]=false;
}
ofstream zapis("zadanie5.txt");

for(int a=0;a<=500;a++)
{
  if(td[a]==true)
{
  cout<<liczby[a]<<endl;
  zapis<<liczby[a]<<endl;
}
}
getch();
}

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