/************************************************************************ * * milliard.cpp * * but : calcul du nombre de syllabes prononcées lorsque * l'on compte à haute voix de 1 à 1 000 000 000. * (plus de détail : http://www.procrastin.fr/blog/ ) * * auteur : procrastin (www.procrastin.fr) * date : 18/05/07 01:52 * *************************************************************************/ #include #include #include #include #include /****************************************** definitions des paramètres ******************************************/ // nombre à atteindre en comptant long int nombremax = 1000000000; // "pas" de l'affichage des résultats int pas = 1000000; // définition des tableaux des nombres de syllabes // pour les dizaines et pour les centaines int syllabedizaine[100]; int syllabecentaine[10]; // définition des nombres de syllabes comptés int nbrsyllabes = 0; long double nbrsyllabestotal = 0; /****************************************** fonctions ******************************************/ // fonction de conversion d'un nombre en format // character vers un format integer int char2int(char nombreencharacter){ int nbrtemp = 0; if (nombreencharacter == '0') { nbrtemp = 0; } else { if (nombreencharacter == '1') { nbrtemp = 1; } else { if (nombreencharacter == '2') { nbrtemp = 2; } else { if (nombreencharacter == '3') { nbrtemp = 3; } else { if (nombreencharacter == '4') { nbrtemp = 4; } else { if (nombreencharacter == '5') { nbrtemp = 5; } else { if (nombreencharacter == '6') { nbrtemp = 6; } else { if (nombreencharacter == '7') { nbrtemp = 7; } else { if (nombreencharacter == '8') { nbrtemp = 8; } else { if (nombreencharacter == '9') { nbrtemp = 9; } } } } } } } } } } return nbrtemp; } /****************************************** ******************************************* ***** ***** main() ***** ******************************************* ******************************************/ int main(){ /****************************************** initialisation de quelques paramètres ******************************************/ // définition des longueurs de nombre (en pseudo-syllabes) syllabedizaine[0] = 0; syllabedizaine[1] = 1; syllabedizaine[2] = 1; syllabedizaine[3] = 1; syllabedizaine[4] = 1; syllabedizaine[5] = 1; syllabedizaine[6] = 1; syllabedizaine[7] = 1; syllabedizaine[8] = 1; syllabedizaine[9] = 1; syllabedizaine[10] = 1; syllabedizaine[11] = 1; syllabedizaine[12] = 1; syllabedizaine[13] = 1; syllabedizaine[14] = 2; syllabedizaine[15] = 1; syllabedizaine[16] = 1; syllabedizaine[17] = 2; syllabedizaine[18] = 2; syllabedizaine[19] = 2; syllabedizaine[20] = 1; syllabedizaine[21] = 3; syllabedizaine[22] = 2; syllabedizaine[23] = 2; syllabedizaine[24] = 2; syllabedizaine[25] = 2; syllabedizaine[26] = 2; syllabedizaine[27] = 2; syllabedizaine[28] = 2; syllabedizaine[29] = 2; syllabedizaine[30] = 1; syllabedizaine[31] = 3; syllabedizaine[32] = 2; syllabedizaine[33] = 2; syllabedizaine[34] = 2; syllabedizaine[35] = 2; syllabedizaine[36] = 2; syllabedizaine[37] = 2; syllabedizaine[38] = 2; syllabedizaine[39] = 2; syllabedizaine[40] = 2; syllabedizaine[41] = 4; syllabedizaine[42] = 3; syllabedizaine[43] = 3; syllabedizaine[44] = 3; syllabedizaine[45] = 3; syllabedizaine[46] = 3; syllabedizaine[47] = 3; syllabedizaine[48] = 3; syllabedizaine[49] = 3; syllabedizaine[50] = 2; syllabedizaine[51] = 4; syllabedizaine[52] = 3; syllabedizaine[53] = 3; syllabedizaine[54] = 3; syllabedizaine[55] = 3; syllabedizaine[56] = 3; syllabedizaine[57] = 3; syllabedizaine[58] = 3; syllabedizaine[59] = 3; syllabedizaine[60] = 2; syllabedizaine[61] = 4; syllabedizaine[62] = 3; syllabedizaine[63] = 3; syllabedizaine[64] = 3; syllabedizaine[65] = 3; syllabedizaine[66] = 3; syllabedizaine[67] = 3; syllabedizaine[68] = 3; syllabedizaine[69] = 3; syllabedizaine[70] = 3; syllabedizaine[71] = 4; syllabedizaine[72] = 3; syllabedizaine[73] = 3; syllabedizaine[74] = 4; syllabedizaine[75] = 3; syllabedizaine[76] = 3; syllabedizaine[77] = 4; syllabedizaine[78] = 4; syllabedizaine[79] = 4; syllabedizaine[80] = 2; syllabedizaine[81] = 3; syllabedizaine[82] = 3; syllabedizaine[83] = 3; syllabedizaine[84] = 3; syllabedizaine[85] = 3; syllabedizaine[86] = 3; syllabedizaine[87] = 3; syllabedizaine[88] = 3; syllabedizaine[89] = 3; syllabedizaine[90] = 3; syllabedizaine[91] = 3; syllabedizaine[92] = 3; syllabedizaine[93] = 3; syllabedizaine[94] = 4; syllabedizaine[95] = 3; syllabedizaine[96] = 3; syllabedizaine[97] = 4; syllabedizaine[98] = 4; syllabedizaine[99] = 4; // définition des longueurs des centaines (en pseudo-syllabes) syllabecentaine[0] = 0; syllabecentaine[1] = 1; syllabecentaine[2] = 2; syllabecentaine[3] = 2; syllabecentaine[4] = 2; syllabecentaine[5] = 2; syllabecentaine[6] = 2; syllabecentaine[7] = 2; syllabecentaine[8] = 2; syllabecentaine[9] = 2; // définition des longueurs des milliers (en pseudo-syllabes) int syllabe_millier; // définition des longueurs des millions (en pseudo-syllabes) int syllabe_million; // définition des variables temporaires relatives aux // nombres à décomposer en dizaine, centaine, millier, etc. long int nombre = 1000000000; char tab[25]; nbrsyllabestotal = 0; /****************************************** sortie des résulats du calcul dans le fichier "sortie.xls" ******************************************/ ofstream outputfile; outputfile.open("sortie.xls", ios::out); // verification que le fichier est bien accessible if (outputfile.is_open()) { } else { cout << "le fichier est encore utilise !"; } outputfile << "nombre \t nb_syllabes \t nb_syllabes_total \n"; /****************************************** boucle principale du calcul ******************************************/ int i; int j=pas; for (i=1; i<=nombremax; ++i) { // pour isoler les chiffres des unités, dizaine, etc. on convertit // le nombre (format int) en character (format char) // int nombre = 251052158,chiff; // char tab[25]; // itoa(nombre, tab, 10); // unité : tab[strlen(tab)-1] // dizaine : tab[strlen(tab)-2] // centaine : tab[strlen(tab)-3] nombre = 2000000000 + i; itoa(nombre, tab, 10); // calcul intermédiaire int tempmillion = syllabecentaine[char2int(tab[strlen(tab)-9])] + syllabedizaine[char2int(tab[strlen(tab)-8])*10 + char2int(tab[strlen(tab)-7])]; int tempmillier = syllabecentaine[char2int(tab[strlen(tab)-6])] + syllabedizaine[char2int(tab[strlen(tab)-5])*10 + char2int(tab[strlen(tab)-4])]; int tempmillierbis = char2int(tab[strlen(tab)-6])*100 + char2int(tab[strlen(tab)-5])*10 + char2int(tab[strlen(tab)-4]); // doit-on prononcer les mots "million" et "millier" ? syllabe_million = 2; if ( tempmillion == 0) { syllabe_million = 0;} syllabe_millier = 1; if ( tempmillierbis <= 1) { syllabe_millier = 0;} //if ( tempmillier >= 2) { syllabe_millier = 1;} // calcul du nombre de syllabes dans le nombre i nbrsyllabes = // millions tempmillion + syllabe_million + // milliers tempmillier + syllabe_millier + // unités syllabecentaine[char2int(tab[strlen(tab)-3])] + syllabedizaine[char2int(tab[strlen(tab)-2])*10 + char2int(tab[strlen(tab)-1])]; nbrsyllabestotal = nbrsyllabestotal + nbrsyllabes; // si on a atteint un des pas d'impression, on affiche le calcul // et on l'ecrit dans le fichier de sortie if ( i == j ) { cout << round((i +0.0)*1000/(nombremax+0.0))/10 << "% " << i << " : " << nbrsyllabes << " : " << nbrsyllabestotal << "\n"; outputfile << i << "\t" << nbrsyllabes << "\t" << nbrsyllabestotal << "\n"; j = j + pas; } } /****************************************** pause en fin pour lire les tests sur la console ******************************************/ cout<