vuoi
o PayPal
tutte le volte che vuoi
Classificazione dei numeri
N S, il numero stesso (perché un qualunque numero è sì un divisore di se stesso, ma improprio). Chiamiamo difettivo un numero intero tale che la somma dei suoi divisori è minore del numero stesso (per esempio: N=10 S=1+2+5=8). Chiamiamo perfetto un numero intero uguale alla somma dei suoi divisori (per esempio: N=6 perché S=1+2+3=6). Chiamiamo abbondante un numero intero tale che la somma dei suoi divisori è maggiore del numero stesso (per esempio: N=42 S=1+2+3+6+7+14+21=54).
(a) Si codifichino le funzioni eC ...somma_divisori(...) ...classifica_numero(...), ciascuna delle quali riceve come parametro un numero intero positivo e mentre la prima funzione restituisce la somma dei divisori del valore del suo parametro (escluso il numero stesso), la seconda funzione restituisce se il valore del suo parametro è difettivo, restituisce se è perfetto, oppure -1.
0restituisce se è abbondante. [4 punti]+1
Nota: sia responsabilità del programma chiamante garantire che il valore passato come parametro sia
positivo (quindi né negativo, né nullo).
Soluzione
<unsigned somma_divisori(unsigned N) {
unsigned d = 1, S = 0;
while (d < N) {
if (N % d == 0) {
S = S + d;
}
d = d + 1;
}
return S;
}
int classifica_numero(unsigned N) {
unsigned S = somma_divisori(N);
if (S < N) return -1;
if (S == N) return 0;
return +1;
}>
Se si continua sul retro di qualche foglio, indicare quale
Informatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 5 di 10
(b) Si codifichi in un programma principale, che acquisisca dallo standard input una sequenza di
C main(),
numeri interi (di lunghezza arbitraria) terminata dal valore e che riporti sullo standard output il
0conteggio delle coppie di numeri consecutivi entrambi difettivi, oppure entrambi perfetti oppure
entrambi abbondandi. [5 punti]
Nota: quando appropriato, si
#include <stdio.h>
#define SENTINELLA 0
unsigned somma_divisori(unsigned N);
int classifica_numero(unsigned N);
int main () {
int corr, prec = -1, cl_corr, cl_prec = 0;
unsigned contaD = 0, contaP = 0, contaA = 0;
do {
scanf("%d", &corr);
if (prec > 0 && cor > 0) {
cl_corr = classifica_numero((unsigned)corr);
if (cl_prec == cl_corr) {
if (cl_corr < 0) contaD++;
else if (cl_corr == 0) contaP++;
else contaA++;
}
}
prec = corr;
cl_prec = cl_corr;
} while (corr != SENTINELLA);
printf("\n Conteggi delle coppie di numeri consecutivi. \n");
printf("\n difettivi: %u", contaD);
printf("\n perfetti: %u", contaP);
printf("\n abbondanti: %u", contaA);
printf("\n");
return 0;
}
// Qui và riportato il codice dei due sottoprogrammi
// ...somma_divisori(...) e ...classifica_numero(...)
qualeInformatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017
Esercizio n. 3 -- foglio 6 di 10(c)
Si considerino le seguenti dichiarazioni di tipo di dato:
#define M 30 typedef struct value { unsigned v; int vclass; } value_t; typedef struct vnode { value_t info; struct vnode* next; } vnode_t; typedef vnode_t* vList;
Si codifichi in una funzione che preso come parametro un intero C
generaLista(int k) se tale numero è positivo, alloca e restituisce una lista dinamica tale che:
- nel primo nodo sia memorizzato il valore
k
(nell’attributov
del campoinfo
) e la sua classificazione in difettivo, perfetto, o abbondante (nell’attributovclass
del campoinfo
); - in ogni nodo successivo al primo sia memorizzata la somma dei divisori del numero nel nodo precedente e la classificazione di questa somma.
La lista generata deve avere al più lunghezza pari a M
. È possibile che la lista generata ammetta un numero di nodi minore (o uguale) di M
.
l'ultimo nodo aggiunto contiene il valore numericoM 1.® ® ®Per esempio: (ha divisori:1,2,5) (ha divisori:1,2,4) (ha divisore:1)10 8 7®(non ha divisori minori di sè stesso)1 0
Nota: quando appropriato, si suggerisce il riutilizzo dei sottoprogrammi definiti al punto 3(a). [5 punti]
SoluzionevList generaLista(int k) {vList testa = NULL;vnode_t *puntCoda = NULL, *puntNuovo;unsigned S = (unsigned)k, counter = 0;while (S > 0 && counter <= M) {puntNuovo = (vnode_t*)malloc(sizeof(vnode_t));puntNuovo->info.v = S;puntNuovo->info.vclass = classifica_numero(S);puntNuovo->next = NULL;if (testa == NULL) {testa = puntCoda = puntNuovo;}else { puntCoda->next = puntNuovo;puntCoda = puntCoda->next;}S = somma_divisori(S);counter += 1;}return testa;}
Se si continua sul retro di qualche foglio, indicare qualeInformatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 7 di 10
Soluzione AlternativavList
InsInFondo(vList testa, value_t elem) { vList punt, cur = testa; punt = (vList) malloc(sizeof(vnode_t)); punt->next= NULL; punt->info = elem; if (testa == NULL) return punt; while (cur->next != NULL) { cur = cur->next; cur->next = punt; } return testa; } vList generaLista(int k) { vList testa = NULL; value_t elem; unsigned S = (unsigned)k, counter = 0; while (S > 0 && counter < M) { elem.v = S; elem.vclass = classifica_numero(S); testa = InsInFondo(testa, elem); S = somma_divisori(S); counter += 1; } return testa; }Se si continua sul retro di qualche foglio, indicare quale Informatica A – a.a. 2016/2017 – 3o Appello – 31/08/2017 Esercizio n. 3 -- foglio 8 di 10