C :: Aufgabe #154

2 Lösungen Lösungen öffentlich

Symmetrische Primzahlen

Anfänger - C von hollst - 03.04.2017 um 13:55 Uhr
Wieviele Primzahlen P < 1.000.000 sind rückwärts gelesen auch eine Primzahl, jedoch ungleich sich selbst?

Anmerkung: Die (Prim)zahlen 2, 3, 5, 7, 11 erfüllen nicht die Bedingungen (sind rückwärts gelesen sich selbst gleich),
als erste erfüllt die 13 die Bedingungen.

Lösungen:

vote_ok
von devnull (8870 Punkte) - 04.04.2017 um 15:36 Uhr

Konsolenausgabe:

13-31 17-71 37-73 79-97 107-701 113-311 149-941 157-751 167-761 179-971
199-991 337-733 347-743 359-953 389-983 709-907 739-937 769-967 1009-9001
...
985799-997589 988199-991889 989099-990989 990799-997099 991499-994199
991999-999199 995699-996599
11184 Mirpzahlen unterhalb 1000000 gefunden.

Quellcode ausblenden C-Code
/*************************
 * mirp.c
 *************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NOPRIME 0      // Marke Nicht-Primzahl
#define PRIME 1        // Marke Primzahl
#define EMIRP 2        // Marke symmetrische Primzahl (Mirpzahl)
#define MAX 1000000    // Array Limit

int numbers[MAX+1];
int max_num;

/* alle Vielfache von n auf NOPRIME setzen */
void set_mult_of_prime(int n) {
int m;
    m = n << 1;
    while(m <= max_num) {
        numbers[m] = NOPRIME;
        m += n;
    }
}

/* naechste Primzahl nach n (Marke PRIME) */
int get_next_prime(int n) {
    while(++n <= max_num && numbers[n] == NOPRIME)
        ;
    return n;
}

/* Ziffernfolge einer Zahl umkehren */
int rev_number(int n) {
    int rn=0;
    do {
        rn = rn*10 + n%10;
        n /= 10;
    } while(n!=0);
    return rn;
}

int main(int argc, char **argv) {
    int next_prime;
    int i, ri, cmirps;

    max_num = (argc==2) ? atoi(argv[1]) : MAX;
    if (max_num > MAX) max_num = MAX;

    /* alle Zahlen als PRIME markieren */
    for (i=0; i <= max_num; i++)
        numbers[i] = PRIME;
    numbers[1] = numbers[0] = NOPRIME;

    /* Primzahlensieb */
    next_prime = 2;
    do {
        set_mult_of_prime(next_prime);
        next_prime = get_next_prime(next_prime);
    } while (next_prime <= max_num);

    /* Primzahlen auf Symmetrie pruefen */
    cmirps = 0;
    for (i=0; i <= max_num; i++)
        if (numbers[i] == PRIME) {
			ri = rev_number(i);
			if (ri > i && numbers[ri] == PRIME) {
				numbers[i] = numbers[ri] = EMIRP;
				printf("%d-%d ", i, ri);
				cmirps+=2;
			}
		}
    printf("\n%d Mirpzahlen unterhalb %d gefunden.\n", cmirps, max_num);
    return 0;
}

vote_ok
von kathleenw (3600 Punkte) - 01.07.2020 um 08:14 Uhr
Quellcode ausblenden C-Code
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
#include <string.h>

int stelle(int zahl, int stelle);
int anzahl(int zahl);
bool istPrim(int zahl);

int main(void)
{
    int i,stellenanzahl,j,k,l, zaehler, umgedrehte_Zahl, grenze, anzahlderPrimzahlen;
    int Primzahl[7];
    grenze = 1000000;
    anzahlderPrimzahlen = 0;
    
    for (i=0;i<7;i++)
        Primzahl[i]=0;
    
    for (i=13; i<=grenze; i++) {
        if (istPrim(i)==true) {
            //ist eine Primzahl
            
            //Zahl umstellen
            stellenanzahl= anzahl(i);
            zaehler= stellenanzahl;
            
            for (j=0;j<stellenanzahl;j++){
                Primzahl[j]= stelle(i,zaehler);
                zaehler = zaehler -1;
            }
            
            umgedrehte_Zahl= Primzahl[0]+Primzahl[1]*10+Primzahl[2]*100+Primzahl[3]*1000+Primzahl[4]*10000+Primzahl[5]*100000+Primzahl[6]*1000000;
            
            if (umgedrehte_Zahl<=grenze && umgedrehte_Zahl!=i){
                if (istPrim(umgedrehte_Zahl)==true )
                    printf("%d und %d sind beides Primzahlen \n", i, umgedrehte_Zahl);
                anzahlderPrimzahlen = anzahlderPrimzahlen +1;
            }
        }
        else {
            //ist keine Primzahl
        }
    }
    
    printf("Es gibt %d Lösungen. Ohne doppelte gibt es %d Lösungen", anzahlderPrimzahlen, anzahlderPrimzahlen/2);
}

//

// gibt die x. Stelle einer Zahl zurück
int stelle(int zahl, int stelle)
{
    zahl = fabs(fmod(zahl/pow(10,stelle-1),10));
    return zahl;
}

//Bestimmt die Anzahl der Zeichen einer Zahl bsp: 37690 ==> anzahl=5
int anzahl(int zahl)
{
    int zeichen;
    char buffer[100];
    sprintf(buffer,"%d",zahl);
    zeichen = strlen(buffer);
    return zeichen;
}

//prüfen ob es eine Primzahl ist
bool istPrim(int zahl) {
    bool prim, faktorgefunden;
    int t;
    
    if (zahl <= 2) {
        if (zahl < 2)
            prim = false;
        else
            prim = true;
    }
    else {
        if (zahl%2 == 0)
            faktorgefunden = true;
        else {
            faktorgefunden = false;
            t = 3;
            while (t*t <= zahl && faktorgefunden == false) {
                if (zahl % t == 0)
                    faktorgefunden = true;
                else
                    t=t+2;
            }
        }
    }
    
    if (faktorgefunden==false)
        prim = true;
    else
        prim = false;
    
    return prim;
}