M3 - Programació estructurada / Exercicis UF1: Iteratius-Solucions

De wikiserver
Dreceres ràpides: navegació, cerca

1. Trobar i mostrar tots els números de quatre xifres que compleixen la condició de què la suma de les xifres en posició senar és igual a les xifres en posició parell. Per exemple : 8217

package iteratius;

public class Ex1 {
    
    public static void main(String[] args) {
        int sumpar, sumimpar, num;
        for (int i=1000;i<=9999;i++){
            num=i;
            sumpar=0;
            sumimpar=0;
            for (int j=1;j<=4;j++){
                if(j%2==1){
                    sumimpar=sumimpar+(num%10);
                }
                else{
                    sumpar=sumpar+(num%10);
                }
                num=num/10;
            }
            if (sumpar==sumimpar){
                System.out.println(i);
            }
        }
    }
}

2. Un centre numèric és un nombre que separa una llista d’enters (començant en 1) en dos grups de números, les sumes dels quals són iguals. El primer centre numèric és el 6, el qual separa la llista (1-8) en els grups (1,2,3,4,5) i (7,8) les sumes de les quals són iguals a 15. El segon centre numèric és el 35, que separa la llista (1 a 49)en els grups (1 a 34) i (36 a 49) les sumes de les quals són iguals a 595. Escriviu un programa que calculi els centres numèrics entre 1 i n (número entrat per l’usuari).

package iteratius;
import java.util.Scanner;

public class Ex2 {
    
    public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num, sumaant=0, sumapost=2, numpost=2;
        System.out.println("Introdueix un valor positiu: ");
        num = teclat.nextInt();
        for (int i=2;i<=num;i++){
            sumaant=0;
            sumapost=0;
            for(int j=1;j<i;j++){
                sumaant = sumaant+j;      //Sumem els numeros anteriors        
            }
            numpost = i+1;
            while (sumaant>sumapost){
                sumapost=sumapost+numpost;  //Sumem els numeros posteriors
                numpost++;
            }
            if (sumaant==sumapost){
                System.out.println("El numero "+i+" es centre numeric.");
            }
        }
    }
}

Donat que cada vegada hem de calcular la suma dels números anteriors al actual, podríem optimitzar el codi, si mantenim la suma dels nombres anteriors a cada iteració i li sumem el número actual -1. Vegem-ho:

package iteratius;
import java.util.Scanner;

public class Ex2 {
    
    public static void main(String[] args) {

        Scanner teclat = new Scanner(System.in);
        int num, sumaant=0, sumapost=2, numpost=2;
        System.out.println("Introdueix un valor positiu: ");
        num = teclat.nextInt();
        for (int i=2;i<=num;i++){
            sumaant=sumaant+i-1;          //Suma dels numeros anteriors 
            sumapost=sumapost-i;
            while (sumaant>sumapost){
                numpost++;
                sumapost=sumapost+numpost;  //Sumem els numeros posteriors               
            }
            if (sumaant==sumapost){
                System.out.println("El numero "+i+" es centre numeric.");
            }
        }
    }
}

3. Per trobar el màxim comú divisor (mcd) de dos números s’utilitza l’algorisme d’Euclides. Donat dos números enters a i b, es mira quin és el més gran. Si el més gran és a, es substitueix per a - b; si el més gran és b es substitueix per b – a, i així successivament fins que a = b. Aleshores a és el mcd. Escriviu un programa que calculi el mcd de dos números.

package iteratius;

import java.util.Scanner;


public class Ex3 {
  public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num1, num2, aux1, aux2;
        System.out.println("Introdueix dos valors positius: ");
        num1 = teclat.nextInt();
        num2 = teclat.nextInt();
        teclat.nextLine();
        aux1=num1;
        aux2=num2;
        while (num1!=num2){
            if (num1>num2) num1=num1-num2;
            else num2=num2-num1;         
        }
        System.out.println("El mcd de "+aux1+" i "+aux2+ " es "+num1);    
        
    }   
}

4. Calculeu aproximadament l’arrel quadrada d’un número real positiu r seguint el mètode de Newton. La successió x 1 , x 2 , x 3 , ..., que està definida per :

                        ( x i + r / x i )
x 0 = r / 2 ,  x i+1 =  _________________ 
                               2

té com a límit l’arrel quadrada de r. El programa acabarà quan |x i+1 – x i | < 0.0001

Nota: Els símbols | | volen dir valor absolut, per calcular-ho existeix la funció Math.abs( ).

package iteratius;

import java.util.Scanner;


public class Ex4 {
     public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        double x1, x2, num;
        final double PRECISIO=0.0001;
        System.out.println("Introdueix un valor real positiu: ");
        num = teclat.nextDouble();
        teclat.nextLine();
        x1=num/2;
        x2=((x1+(num/x1))/2);
        while (Math.abs(x2-x1)>=PRECISIO){
            x1=x2;
            x2=((x1+(num/x1))/2);
        }
        System.out.println("L'arrel quadrada de "+num+" amb una precisio de "+PRECISIO+ " es "+x2);    
        
    }    
}

5. Es diu que un número es perfecte si la suma dels seus divisors és igual al mateix número. Per exemple el número 6 és perfecte perquè la suma dels seus divisors (1+2+3) és igual a 6. Trobeu tots els números perfectes entre 1 i un numero introduït per teclat.

package iteratius;

import java.util.Scanner;

public class Ex5 {
    public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num, sumadiv=0;
        System.out.println("Introdueix un enter positiu: ");
        num = teclat.nextInt();
        for (int i=1;i<=num;i++){
            sumadiv=0;
            for (int j=1;j<i;j++){
                if (i%j==0) sumadiv=sumadiv+j;
            }
            if (sumadiv==i) System.out.println(i+" és un número perfecte");
        }                 
    }    
}

6. Es diu que un número és deficient si no arriba a ser perfecte. perquè la suma dels divisors del número és menor que el número. En el sentit contrari, es diu que un número és abundant si la suma dels divisors és més gran que ell. Construïu un programa que per a un rang de 1 a n, sent n entrada pel programa, determini si el número és deficient, perfecte o abundant. Indiqueu també quants hi ha de cada un dels tipus.

package iteratius;

import java.util.Scanner;


public class Ex6 {
    public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num, sumadiv=0, contperf=0, contabund=0, contdef=0;
        System.out.println("Introdueix un enter positiu: ");
        num = teclat.nextInt();
        for (int i=1;i<=num;i++){
            sumadiv=0;
            for (int j=1;j<i;j++){
                if (i%j==0) sumadiv=sumadiv+j;
            }
            if (sumadiv>i) {
                System.out.println(i+" és un número abundant");
                contabund++;
            }
            else if (sumadiv<i){
                System.out.println(i+" és un número deficient");
                contdef++;
            }
            else{
                System.out.println(i+" és un número perfecte");
                contperf++;
            }
        }
        System.out.println("------------------------------------");
        System.out.println("Abundants: "+contabund);
        System.out.println("Deficients: "+contdef); 
        System.out.println("Perfectes: "+contperf);
    }    
}

7. Es diu que dos números són primers bessons si ambdós són primers i estan separats per una distància de 2. Per exemple : {3,5}, {5,7}, {11,13},{17,19}. Construïu un programa que donat un rang de 1 a n, sent n entrada pel programa, determini els primers bessons que hi ha en aquest rang.

public class Ex7 {
    
    public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num, numprim1, numprim2=0, div;
        System.out.println("Introdueix un enter positiu: ");
        num = teclat.nextInt();              
        for (int numact=1; numact<=num; numact+=2){
            numprim1=numprim2;
            div=2;
            while (div<numact && numact%div!=0){                  
                   div++;
            }       
            if (numact==div) numprim2=numact;
            if (numprim1==numprim2-2)  System.out.print("{"+numprim1+","+numprim2+"},");
        }
                     
    }    
}

8. Es diu que dos números són amics si la suma dels divisors d’un donen com a resultat el valor de l’altre i viceversa. Construïu un programa que determini si dos números n1i n2 entrats per teclat són amics o no.

Exemple: (220, 284)
divisors de 220: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 i 110. Sumen 284.
divisors de 284: 1, 2, 4, 71 i 142. Sumen 220.
package iteratius;

import java.util.Scanner;

public class Ex8 {
     public static void main(String[] args) {
    
        Scanner teclat = new Scanner(System.in);
        int num1, num2, sumdivnum1=0, sumdivnum2=0;
        System.out.println("Introdueix dos enters positius: ");
        num1 = teclat.nextInt();
        num2 = teclat.nextInt();
        teclat.nextLine();
        for (int div=1;div<num1/2;div++) if(num1/div==0) sumdivnum1=sumdivnum1+div;
        for (int div=1;div<num2/2;div++) if(num1/div==0) sumdivnum2=sumdivnum2+div;        
        if (sumdivnum1==num2 && sumdivnum2==num1)  System.out.print(num1+" i "+num2+" són amics.");
        else System.out.print(num1+" i "+num2+" no són amics.");
                     
    }    
}


9. Escriviu un programa que generi els 20 primers números que en descompondre’ls en factors primers només apareguin els números 2, 3 i 5.

package iteratius;

public class Ex9 {

    public static void main(String[] args) { 

        int cont=0, div, valoractual=0, num=2;
        boolean posible;
        while (cont<20) {
          div=2;
          valoractual = num;         
          posible=true;
          while (valoractual>1 && posible){
              if (valoractual%div==0) valoractual=valoractual/div;
              else {
                  div++;                 
                  if (div > 5) posible=false;
              }
          } 
          if (posible){
            System.out.print(num+",");
            cont++;
        }
        num++;           
     }  
                    
    }    
}

10. Escriviu un programa que mostri tots els números de tres xifres que compleixen que cada una de les xifres és més gran que les que té més a l’esquerra. Per exemple : 123, 248,....

package iteratius;

public class Ez10 {
    
    public static void main(String[] args) { 

        for (int i=1;i<=9;i++){
           for (int j=1;j<=9;j++){
               for (int k=1;k<=9;k++){
                  if (i<j && j<k) {
                      System.out.print(i);
                      System.out.print(j);
                      System.out.println(k);
                  }                  
               }
           }           
        }   
    }
}


11. Escriviu un programa que mostri tots els números de tres dígits que siguin iguals a la suma dels cubs dels seus dígits.

Solució: 153, 370, 371, 407

package iteratius;

public class Ex11 {
    
    public static void main(String[] args) { 

        int sumaPot, num;
        for (int i=1;i<=9;i++){
           for (int j=0;j<=9;j++){
               for (int k=0;k<=9;k++){
                  sumaPot=(int)Math.pow(i,3)+(int)Math.pow(j, 3)+(int)Math.pow(k, 3);
                  //System.out.println(i+" "+j+" "+k+" = "+sumaPot);
                  num = i*100+j*10+k;
                  if (num==sumaPot) {                                                                  
                      System.out.print(i);
                      System.out.print(j);
                      System.out.println(k);
                  }                  
               }
           }           
        }   
    }
}