Etichete: nicio etichetă

PROBLEME RECAPITULATIVE – clasa a 9-a
ANEXA 1 : Un număr este palindrom-ciclic dacă devine un palindrom printr-un număr de permutări circulare. Să se înlocuiască toate valorile palindrom-ciclic din triunghiul de nord cu suma elementelor aproape prime din triunghiul de est. Un număr este aproape prim dacă se scrie ca produs de două numere prime distincte.

	#include <iostream>
        using namespace std;

        #define lim 501
        #define bound 50000

		void citire(int &n, long long a[][lim]){
            cin >> n;
            for(int i=1; i<=n; i++)
                for(int j=1; j<=n; j++)
                    cin >> a[i][j];
        }

        int prime[6000];
        bool compus[bound+1];

        void cautaPrime(){
            compus[0] = compus[1] = true;

            for(int i=4; i<=bound; i+=2)
                compus[i] = true;

            for(int i=3; i*i<=bound; i+=2)
                if(!compus[i])
                    for(int j=i*i; j<=bound; j+=2*i)
                        compus[j] = true;
            int k = 0;
            prime[++k] = 2;
            for(int i=3; i<=bound; i+=2)
                if(!compus[i])
                    prime[++k] = i;
        }

        bool isPrime(int num){
            if(num <= 1)
                return false;

            for(int i=1; prime[i] * prime[i] <= num; i++)
                if(num % prime[i] == 0)
                    return false;
            return true;
        }

        bool esteAproapePrim(int num){

            for(int i=1; i*i < num; i++)
                if(num != 2 * i && isPrime(i) && isPrime(num/i))
                    return true;
            return false;
        }

        void cautaAP(int n, long long a[][lim], long long &sumAP, int &ct){
            for(int j=(n+1)/2 + 1; j<=n; j++)
                for(int i = n - j + 2; i <= j - 1; i++)
                    if(esteAproapePrim(a[i][j]))
                        sumAP += a[i][j], ct++;
        }

        long long oglindit(int num){
            long long og = 0;
            do{
                int digit = num % 10;
                num /= 10;
                og = 1ll * (og * 10 + digit);
            }while(num);
            return og;
        }

        int log10(int num){
            int f = 1;
            while(num > 9){
                f *= 10;
                num /= 10;
            }
            return f;
        }

        long long perm(long long num, int f){
            return num % 10 * f + num / 10;
        }

        bool estePalCyc(int num){

            long long aux = num;
            int f = log10(num);
            do{
                if(1ll * num == oglindit(num))
                    return true;
                num = perm(num, f);
            }while(1ll * num != aux);
            return false;
        }

        void modifTablou(int n, long long a[][lim], long long sumAP, int &ct){
            for(int i=1; i<=(n+1)/2; i++)
                for(int j=i+1; j<=n-i; j++)
                    if(estePalCyc(a[i][j]))
                        a[i][j] = sumAP, ct++;

        }

        void display(int n, long long a[][lim], long long sumAP, int ct1, int ct2){
            cout << "S-au realizat " << ct2 << " modificari, dependente de suma" << sumAP << ", compusa pe baza a " << ct1 << " numere.\n";
            cout << "Iata tabloul trecut prin proces  : \n";
            for(int i=1; i<=n; i++){
                for(int j=1; j<=n; j++)
                    cout << a[i][j] << " ";
                cout << "\n";
            }
        }
        int main()
        {
            int n;
            long long a[lim][lim];
            citire(n, a);

            cautaPrime();

            long long sumAP = 0;
            int ct1 = 0;
            cautaAP(n, a, sumAP, ct1);

            int ct2 = 0;
            modifTablou(n, a, sumAP, ct2);

            display(n, a, sumAP, ct1, ct2);
            return 0;
        }

Du-te sus!