martes, 25 de octubre de 2016

Euler #17

https://projecteuler.net/problem=17

   1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 char* get_prefix(int number) {
6 char* text;
7 int tmpI;
8 switch (number) {
9 case 20:
10 text = "twenty ";
11 break;
12 case 30:
13 text = "thirty ";
14 break;
15 case 40:
16 text = "forty ";
17 break;
18 case 50:
19 text = "fifty ";
20 break;
21 case 60:
22 text = "sixty ";
23 break;
24 case 70:
25 text = "seventy ";
26 break;
27 case 80:
28 text = "eighty ";
29 break;
30 case 90:
31 text = "ninety ";
32 break;
33 default:
34 text = "";
35 }
36 return text;
37 }
38
39 int strlenNoSpaces(char* str) {
40 int cont = 0;
41 for (int i = 0; str[i] != '\0'; i++) {
42 if (str[i] != ' ') cont++;
43 }
44 return cont;
45 }
46
47 char* get_number_spelled(int number) {
48 char* text;
49 char* tmpS1;
50 char* tmpS2;
51 char* tmpS3;
52 int tmpI;
53 if (number < 1)
54 text = "";
55 else if (number == 1)
56 text = "one";
57 else if (number == 2)
58 text = "two";
59 else if (number == 3)
60 text = "three";
61 else if (number == 4)
62 text = "four";
63 else if (number == 5)
64 text = "five";
65 else if (number == 6)
66 text = "six";
67 else if (number == 7)
68 text = "seven";
69 else if (number == 8)
70 text = "eight";
71 else if (number == 9)
72 text = "nine";
73 else if (number == 10)
74 text = "ten";
75 else if (number == 11)
76 text = "eleven";
77 else if (number == 12)
78 text = "twelve";
79 else if (number == 13)
80 text = "thirteen";
81 else if (number == 14)
82 text = "fourteen";
83 else if (number == 15)
84 text = "fifteen";
85 else if (number == 16)
86 text = "sixteen";
87 else if (number == 17)
88 text = "seventeen";
89 else if (number == 18)
90 text = "eighteen";
91 else if (number == 19)
92 text = "nineteen";
93 else if (number >= 20 && number < 100 ) {
94 tmpI = 10 * (number / 10);
95 tmpS1 = get_prefix(tmpI);
96 tmpS2 = get_number_spelled(number - tmpI);
97 text = malloc((sizeof(char) * strlen(tmpS1) + 1) +
98 (sizeof(char) * strlen(tmpS2) + 1));
99 strcpy(text, tmpS1);
100 strcat(text, tmpS2);
101 } else if (number >= 100 && number < 1000 ) {
102 tmpI = number / 100;
103 tmpS1 = get_number_spelled(tmpI);
104 tmpS2 = number == 100 * tmpI ? " hundred " : " hundred and ";
105 tmpS3 = get_number_spelled(number - tmpI * 100);
106 text = malloc((sizeof(char) * strlen(tmpS1) + 1) +
107 (sizeof(char) * strlen(tmpS2) + 1) +
108 (sizeof(char) * strlen(tmpS3) + 1));
109 strcpy(text, tmpS1);
110 strcat(text, tmpS2);
111 strcat(text, tmpS3);
112 } else if (number >= 1000 && number < 10000) {
113 tmpI = number / 1000;
114 tmpS1 = get_number_spelled(tmpI);
115 tmpS2 = " thousand ";
116 tmpS3 = get_number_spelled(number - tmpI * 1000);
117 text = malloc((sizeof(char) * strlen(tmpS1) + 1) +
118 (sizeof(char) * strlen(tmpS2) + 1) +
119 (sizeof(char) * strlen(tmpS3) + 1));
120 strcpy(text, tmpS1);
121 strcat(text, tmpS2);
122 strcat(text, tmpS3);
123 }
124 return text;
125 }
126
127 int main() {
128 char* text;
129 long cont = 0L;
130 for (int i = 1; i < 1001; i++) {
131 text = get_number_spelled(i);
132 //printf("%d => %s, chars: %d\n", i, text, strlenNoSpaces(text));
133 cont += strlenNoSpaces(text);
134 }
135 printf("%ld chars\n", cont);
136 return 0;
137 }
138

No hay comentarios:

Publicar un comentario