Advertisement
Alx09

Ex22

Apr 26th, 2020
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int palindrom_10(int n) // verificam daca este palindrom in baza 10
  5. {
  6.     long long c = 0, x = n; // variabile ajutatoare
  7.     while (x) // cat timp exista
  8.     {
  9.         c = c * 10 + x % 10; construim inversul numarului
  10.         x /= 10; // impartim la 10
  11.     }
  12.     if (n == c) // daca numarul este egal cu inversul este palinfro
  13.         return 1; // returnam 1
  14.     return 0; /// altfel returnam 0
  15. }
  16.  
  17. int palindrom_2(int n) // verificam daca este palindrom in baza 2
  18. {
  19.     int v[33], nr = 0, j, x = n; // variabile auxilare
  20.    
  21.     while (x) // cat timp exista numarul
  22.     {
  23.         v[nr++] = x % 2;//punem restul imparitiri la 2 in vector
  24.         x /= 2; // impartim la 2
  25.     }
  26.     for ( j = 0; j < nr; j++) // verificaam daca cifrele pe pozitii simetrice sunt aceleasi
  27.        if (v[j] != v[nr - 1 - j])  // in caz ca sunt fiertie returnam 0
  28.             return 0;
  29.    
  30. return 1; // altfel raturnam 1
  31. }
  32.  
  33. int palindrom_8(int n) // verificam daca este palindrom in baza 8
  34. {
  35.     int  nr = 0, v[33], j; // variabile auxiliare
  36.     int  x = n; // copiem n
  37.     while (x) //cat timp exista x
  38.     {
  39.         v[nr++] = x % 8; // puntem restul impartiri la 8 in vector
  40.         x /= 8; // impartim la 8 numarul
  41.     }
  42.     for ( j = 0; j < nr; j++)// cumparam din nou cifrele pe poziti simetrice fata de milojc
  43.         if (v[j] != v[nr - 1 - j]) // in caz ca sunt diferite
  44.             return 0; // afisam 0
  45.    
  46.     return 1;// altfel afisam 1
  47. }
  48.  
  49. int palindrom_16(int n) // verificam daca este palindrom in baza 16
  50. {
  51.     int j , nr = 0;// variabile auxiliare
  52.     char v[33]; // salvam cifrele numarul in el
  53.     int x = n;
  54.     while (x) // cat timp exista x ( x este diferit de 0)
  55.     {
  56.         if (x % 16 <= 9) // daca restul imparitiri este mai mic sau egal cu 9 i-l adaugam in vector
  57.             v[nr++] = x % 16 + '0';
  58.         else
  59.             v[nr++] = 'A' + (x % 16) - 10;// altfel adauagm litera corespunzatoare falori hexazecimale
  60.         x /= 16; // impartim numarul la 10
  61.     }
  62.     for ( j = 0; j < nr; j++) // verificam daca pozitiile simetrice fata de miljoc sunt aceleasi
  63.         if (v[j] != v[nr - 1 - j]) // daca sunt diferite
  64.             return 0; // returnam 0
  65.    
  66.     return 1;// altfel returnam 1
  67. }
  68.  
  69. int main() {
  70.     int n, i, d; // variabile ajutatoare
  71.     FILE *f; // variabila de tip fiser
  72.     f = fopen("in.txt", "r");// deschidem in mod citire
  73.     fscanf(f, "%d", &n); // citim n din fiser
  74.     fclose(f);// nu ne mai trebuie fiserul asa ca-l inchidem
  75.     f = fopen("out.txt", "w"); // deschidem in mod scriere
  76.     for (i = 0; i <= n; i++)
  77.     {
  78.             d = 0; // pentru a numara in cate baza este palindrom
  79.             d += palindrom_2(i); // i-l adunam cu valoarea returnata
  80.             d += palindrom_8(i); //i-l adunam cu valoarea returnata
  81.             if (d > 1) { // daca este deja palindrom in 2 baze nu mai este necesar sa le verificam pe retsu
  82.                 fprintf(f, "%d\n", i); // asa ca afisam numarul
  83.                 continue; // si ne ducem la urmatoarea iteratie a lui i
  84.             }
  85.             d += palindrom_10(i); // daca ajungem aici insemana ca e palindrom in ce-l mult o baza
  86.             if (d > 1) { // din nou daca este palindrom in ce-l putin doua baze
  87.                 fprintf(f, "%d\n", i);// i-l afisam
  88.                 continue; // ne ducem la urmatoarea iteratie a lui i
  89.             }
  90.             d += palindrom_16(i); // inseamna ca e ce-l palindrom in maxim o baza  2,8,10
  91.            
  92.         if (d > 1) // am verificat toate bazele
  93.             fprintf(f, "%d\n", i); // in caz ca este palindrom in baza 2, sau 8 sau 10 si in 16 i-l afisem
  94.     }// ne intoarcem la urmatoarea iteratie a lui i
  95. fclose(f);
  96. return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement