• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie odnośnie szukania liczb pierwszych

Object Storage Arubacloud
0 głosów
241 wizyt
pytanie zadane 2 czerwca 2020 w C i C++ przez Cincin Nowicjusz (240 p.)

Witam!

Mam problem z zadaniem, którego treść brzmi:

 Napisz program, który wypisuje wszystkie liczby pierwsze z przedziału <2;10000> , takie że ich suma cyfr jest równa 2n, gdzie n – jest ilością cyfr danej liczby. 

Jestem w takim etapie zadania i nie wiem co robić dalej lub też czy mam jakiś zły zapis w kodzie. W pierwszej funkcji określam ilość cyfr danej liczby i ich sume cyfr. Funkcja main natomiast wyłapuje liczby pierwsze z przedziału (tzw. sito, które musi być w tym zadaniu!). Każdemu który wstępnie zajmie się moim problemem bardzo dziękuje :D . 

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <math.h>

using namespace std;

int x, n;

int warunek(int n){
     int i=0;
         do
         {
            n=n/10;
            i++;
         }while(n>0);
         return i;
         
    string b=to_string(n);
    int dl=b.length();
    
    int suma=0;
    for (int i=0; i<dl; i++){
        suma+=(int)(b[i])-48;
        }
    
        if(suma==2*n){
            
            } 
         
       }


int main(){
    cout<<"Podaj gorna granice: "<<endl;
    cin>>n;
int i,j, g, k;    

    
    int *tab = new int[n];
    
    for(i=0; i!=k; i++)
        {
            tab[i]=i;
        }
        
        g=floor(sqrt(k));
        
        printf("\n----granica = %d \n", g);
        
        for(i=2; i<g+1; i++)
            {
            if(tab[i]!=0)
                    {
                        j=i+i;
                        while(j<=k)
                        {
                            tab[j]=0;
                            j=j+i;
                            }
                        }
                }
    printf("\n Liczby piwerwsze to: ");
    for (i=2; i<=k; i++)
        {
            if(tab[i]!=0) printf("%d ", i);
            
            }
            printf("\n");
    return 0;
}

komentarz 2 czerwca 2020 przez LuQ232 Mądrala (7,200 p.)

Czym jest zmienna k w tym kawałku kodu? Wcześniej ją deklarujesz ale nie przypisujesz żadnej wartości... Czy nie powinno tam być n?

    for(i=0; i!=k; i++)
        {
            tab[i]=i;
        }
         
        g=floor(sqrt(k));

 

komentarz 2 czerwca 2020 przez Cincin Nowicjusz (240 p.)

Nie wiem, już ci szczerze powiem że dziś się pogubiłem w tym zadaniu

Ogólnie to muszę w tym zadaniu użyć tzw. sita Eratostenesa, które wygląda tak: 


#include <stdio.h>
#include <math.h>

int main()
{
	int i,j, g, n;
	printf("Podaj gorna granice");
	scanf("%d",&n);
	
	int *tab = new int[n];
	
	for(i=0; i!=n; i++)
		{
			tab[i]=i;
		}
		
		g=floor(sqrt(n));
		
		printf("\n----granica = %d \n", g);
		
		for(i=2; i<g+1; i++)
			{
			if(tab[i]!=0)
					{
						j=i+i;
						while(j<=n)
						{
							tab[j]=0;
							j=j+i;
							}
						}
				}
	printf("\n Liczby piwerwsze to: ");
	for (i=2; i<=n; i++)
		{
			if(tab[i]!=0) printf("%d ", i);
			
			}
			printf("\n");
	return 0;
}

Po prostu zmieniłem n na k, żeby był bardziej przejrzyście, a n już używałem w pierwszej funkcji 

2 odpowiedzi

0 głosów
odpowiedź 3 czerwca 2020 przez TOM_CPP Pasjonat (22,640 p.)

Rozbij sobie to na funkcje, które sprawdzają odpowiednio:

  1. Czy liczba jest pierwsza  isPrime
  2. Czy spełniony jest warunek sumy cyfr isProperDigitSum
using namespace std;

bool isPrime( int n )
{
    if( n <= 1 ) return false;
    for( int i {2} ; i<n ; ++i ) if( n%i == 0 ) return false;
    return true;
}

bool isProperDigitSum( int number )
{
    string snumber {to_string(number)};
    int n {snumber.size()};

    int sum {0};
    for( const auto& digit : snumber )
    {
        sum += ( static_cast<int>(digit) - static_cast<int>('0') );
    }
    return sum == 2*n ? true : false ;
}

int main()
{
    for( int i=2 ; i<10000 ; ++i )
    {
        if( isPrime(i) )
        {
            if( isProperDigitSum(i) ) cout << i << "\n";
        }
    }
    return 0;
}

 

komentarz 3 czerwca 2020 przez Cincin Nowicjusz (240 p.)

Powiem ci że bardzo dziękuje i jak innego rozwiązania nie znajdę to skorzystam z twojego :D . Ale niestety muszę skorzystać z tzw. sita, o którym wspomniałem wyżej :\ . Wygląda ono tak:

#include <stdio.h>
#include <math.h>
 
int main()
{
    int i,j, g, n;
    printf("Podaj gorna granice");
    scanf("%d",&n);
     
    int *tab = new int[n];
     
    for(i=0; i!=n; i++)
        {
            tab[i]=i;
        }
         
        g=floor(sqrt(n));
         
        printf("\n----granica = %d \n", g);
         
        for(i=2; i<g+1; i++)
            {
            if(tab[i]!=0)
                    {
                        j=i+i;
                        while(j<=n)
                        {
                            tab[j]=0;
                            j=j+i;
                            }
                        }
                }
    printf("\n Liczby piwerwsze to: ");
    for (i=2; i<=n; i++)
        {
            if(tab[i]!=0) printf("%d ", i);
             
            }
            printf("\n");
    return 0;
}

 

0 głosów
odpowiedź 3 czerwca 2020 przez niezalogowany

Tablica sito jest tablicą typu logicznego, gdzie sito[i] = 0, dla i >= 2, wtedy i tylko wtedy gdy i jest pierwsze (technika sita Eratostenesa). Następnie iteruje się od 2 do 10000 i jeżeli jest pierwsza to liczę jej sumę cyfr i sprawdzam czy jest równa dwukrotności ilości cyfr (ilość cyfr to: to_string(i).size()). Jak będziesz miał jakieś pytania to pisz.

#include <bits/stdc++.h>

using namespace std;

#define LL long long
#define ULL unsigned LL
#define LD long double

const int N = 1e4 + 7;
bool sito[N];

int main() {
	int n = 10000;
	for(int i=2; i<=n; i++) {
		if(!sito[i]) {
			for(int j=i*i; j<=n; j+=i)
				sito[j] = 1;
		}
	}
	for(int i=2; i<=n; i++) {
		if(!sito[i]) {
			int x = i;
			int suma = 0;
			while(x != 0) {
				suma+=(x%10);
				x/=10;
			}
			if(suma == 2*(to_string(i).size()))
				cout<<i<<" ";
		}
	}
}

 

Podobne pytania

0 głosów
0 odpowiedzi 227 wizyt
pytanie zadane 26 kwietnia 2016 w C i C++ przez RycerzAndromedy Użytkownik (670 p.)
+1 głos
1 odpowiedź 282 wizyt
+1 głos
1 odpowiedź 152 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...