-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcifre.c
89 lines (81 loc) · 3.18 KB
/
cifre.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
/*
* Numero di cifre per rappresentare un numero naturale
* Author: ER
* Date: 2022/10/15
* Note:
*/
/*
## Numero di cifre (cifre)
Un numero naturale n si può rappresentare in diverse basi.
Ad esempio sette 7<sub>10</sub> = 111<sub>2</sub> = 21<sub>3</sub> = 13<sub>4</sub> = 12<sub>5</sub> = 11<sub>6</sub> = 10<sub>7</sub> = 7<sub>b</sub> (per b ≥ 8).
Dato un numero naturale n ed il valore della base B (2 ≤ B ≤ 16), si determini il numero di cifre (significative!) necessarie per rappresentare n in base B.
Si ricorda che lo zero si rappresenta con una cifra 0 qualunque sia la base.
(Quale altro numero si rappresenta allo stesso modo in tutte le diverse basi?)
**Assunzione**: 0 ≤ n ≤ 10<sup>9</sup>, 2 ≤ B ≤ 16.
**Formato di input**: leggere n e B da tastiera (senza controlli di validità)
**Formato di output**: il risultato richiesto, che rappresenta quante cifre si usano per rappresentare n in base B.
**Esempi**:
| Input | Output | Note |
| ------------ | ------ | ------------------------------------------ |
| 0 7 | 1 | 0<sub>10</sub> = 0<sub>7</sub> (1 cifra) |
| 7 2 | 3 | 7<sub>10</sub> = 111<sub>2</sub> (3 cifre) |
| 189234567 10 | 9 | 189234567<sub>10</sub> (9 cifre) |
*/
#include <stdio.h>
#define DEBUG 1
int main(int argc, char *argv[])
{
int numero, base;
printf("Numero: ");
scanf("%d", &numero);
printf("Base: ");
scanf("%d", &base);
// visualizzazione valori acquisiti per verifica
printf("Numero: %d \n", numero);
printf("Base: %d \n", base);
// elaborazione
{
// idea 1: "converto" e conto le cifre, senza memorizzarle
int cifre = 0; // numero di cifre necessario
int n = numero; // dato temporaneo
do
{
n /= base; // get rid of the units
cifre++; // one digit more
if (DEBUG)
printf("\tn = %d, cifre = %d \n", n, cifre);
} while (n > 0);
printf("1: numero di cifre: %d \n", cifre);
}
{
// idea 2: esponente tale che (base^esponente > numero)
int cifre = 1; // esponente
int potenza = base; // base^1 = base
while (potenza <= numero)
{
potenza *= base; // next power
cifre++; // next esponente
if (DEBUG)
printf("\tpotenza = %d, cifre = %d \n", potenza, cifre);
}
printf("2: numero di cifre: %d \n", cifre);
}
// NOTA:
// quale delle due soluzioni esegue meno operazioni?
// quale delle due soluzioni può dare overflow?
// Provare ad esempio con 1500000001 in base 10
{
// idea 3: come 2 ma evita overflow
int cifre = 1; // esponente
int potenza = 1; // base^0 = 1
while (numero / potenza >= base)
{
potenza *= base; // next power
cifre++; // next esponente
if (DEBUG)
printf("\tpotenza = %d, cifre = %d \n", potenza, cifre);
}
printf("3: numero di cifre: %d \n", cifre);
}
return 0;
}