Blue Flower

Esercizio No.15:soluzione

Dati in input il numeratore ed il denominatore e denominatore di una frazione scrivi un algoritmo che riesca a ridurre al frazione ai minimi termini. 
Per realizzare questa procedura possono bastare tre variabili int n,d,j; dove ovviamente (n) è il numeratore e (d) il denominatore mentre (j) è una variabile ausiliaria. 
Per semplificare il nostro compito "costringiamo" l'utente ad inserire come denominatore e numeratore due numeri maggiori di zero; questo solo per semplificare le cose, senza che vi siano da valutare tutte le varianti di output (quando solo uno dei due numeri è negativo) oltre ad evitare l'eventualità di una divisione per zero.

do
{
printf("Inserisci il numeratore: ");
scanf("%d",&n);
printf("Inserisci il denominatore: ");
scanf("%d",&d);
}
while(n<0 || d<=0); 
}//fine main

il nucleo dell'algoritmo è semplicemente una struttura if-else-if come di seguito riportato.
1) se (n) è divisibile per (d) il nuovo valore di n è n/d mentre d=1. 
2) se (d) è divisibile per (n) il nuovo valore di d è d/n mentre n=1. 
Se non si verifica una delle condizioni precedenti, allora si cerca un numero (j) pari alla metà del minore tra (n) e (d) e si cerca di dividere simultaneamente sia n che d per j. 
Se l'operazione riesce il nuovo valore di n sarà n/j e il nuovo valore di d sarà d/j. 
Se l'operazione non riesce, j viene decrementato di una unità e si ritenta la divisione, questo finchè j>1;. 
Il codice completo è il seguente:

 
#include <stdio.h>
#include <stdlib.h>
main()
{
int n,d,j;
do
{
printf("Inserisci il numeratore: ");
scanf("%d",&n);
printf("Inserisci il denominatore: ");
scanf("%d",&d);
}
while(n<0 || d<=0);
if(n%d==0)
{n=n/d;d=1;}
else if(d%n==0)
{d=d/n;n=1;}
else
{
if(n<d)j=n/2;
else j=d/2;
do
{
if(n%j==0 && d%j==0){n=n/j;d=d/j;}
j--;
}
while(j>1);
}//fine else
if(n==0) printf("%d", n=0);
else if(d==1) printf("%d",n);
else printf("%d/%d",n,d);
}//fine main

Si nota come l'operazione di output venga diversificata a secondo se la soluzione è un numero intero o frazionario. Questo codice può essere facilmente rappresentato dal seguente diagramma di flusso.