Advertisement
Abelsor

VPL - Ejercicio 2

Mar 8th, 2022
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.33 KB | None | 0 0
  1. /*
  2.                             VPL - Ejercicio 2  
  3.         Escriba una función en C++ que reciba dos enteros positivos N y C.
  4.         Esta función debe retornar la cantidad de números primos de C dígitos que pueden formarse con los dígitos de N. Para formar los números a comprobarse,
  5.          deben tomarse los dígitos contiguos de N en forma ordenada (de izquierda a derecha), así como se muestra en los ejemplos.
  6.         Si en el proceso se generan números “repetidos”, se cuenta por cada uno de ellos (se muestra un ejemplo).
  7.        
  8.         Entrada N / C                                       Salida
  9.         13787   1               1, 3, 7, 8, 7                  2
  10.         144    1                1, 1, 4                        3
  11.         13787   2               13, 37, 78, 87                 2
  12.         13787   >=6             Ninguno                       -1
  13. */
  14. #include<iostream>
  15.  
  16. using namespace std;
  17.  
  18. int cantDigitos(int);
  19. bool esPrimo(int);
  20. int potencia(int, int);
  21. int cantNoPrimos_C_Digitos(int a, int b);
  22.  
  23. int main()
  24. {
  25.    
  26.     int N,C;
  27.     cin>>N>>C;
  28.     cout<<"Cantidad de no-primos de "<<C<<" digitos: "<<cantNoPrimos_C_Digitos(N,C)<<endl;
  29.     return 0;
  30. }
  31.  
  32. int cantDigitos(int n)
  33. {
  34.     int cont=0;
  35.     while(n>0){
  36.         cont++;
  37.         n/=10;
  38.     }
  39.    
  40.     return cont;
  41. }
  42.  
  43. bool esPrimo(int n)
  44. {
  45.     int cont=0;
  46.     for(int i=2 ; i<=n ; i++){
  47.         if(n%i==0)
  48.             cont++;
  49.     }
  50.     if(cont==1)
  51.         return true;
  52.     return false;
  53. }
  54.  
  55. int potencia(int a, int b)
  56. {
  57.     int acumulador=1;
  58.    
  59.     for(int i=0 ; i<b ; i++){
  60.         acumulador *= a;
  61.     }
  62.     return acumulador;
  63. }
  64.  
  65. /*
  66.     Este codigo separa linea por linea los numeros deseados(en este caso en pares de 2)
  67.    
  68.     int n=354281;
  69.     cout<<"-->"<<n<<endl;
  70.     cout<<"35 -->"<<(n/10000)%100<<endl;
  71.     cout<<"54 -->"<<(n/1000)%100<<endl;
  72.     cout<<"42 -->"<<(n/100)%100<<endl;
  73.     cout<<"28 -->"<<(n/10)%100<<endl;
  74.     cout<<"81 -->"<<(n)%100<<endl;
  75.    
  76.     Si nos fijamos, el divisor de 'N' va decrementando de forma exponencial (10^i) donde i decrementa hasta llegar a i=0 y empieza en i = cantDigitos de 'N' - cantNumTomados(C, segun el enunciado)
  77.      
  78.     Ademas, el valor por el cual de hace la operacion '%', tambien esta representado exponencialmente como 10^cantNumTomados(C, segun el enunciado)
  79.    
  80.     Asi de forma general tenemos -->  num = (n/(10^i))%(10^C)
  81. */
  82.  
  83. int cantNoPrimos_C_Digitos(int a, int b)
  84. {
  85.     int cont=0;
  86.     int num;
  87.    
  88.     if(b>cantDigitos(a))
  89.         return -1;
  90.        
  91.     for(int i=cantDigitos(a)-b ; i>=0 ; i--){
  92.         num = (a/potencia(10,i))%potencia(10,b);
  93.         if(!esPrimo(num))
  94.             cont++;
  95.     }
  96.     return cont;   
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement