aboutsummaryrefslogtreecommitdiffstats
path: root/17-Number-Letter-Counts/wordnums.c
diff options
context:
space:
mode:
authormjfernez <mjfernez@gmail.com>2020-02-14 18:35:11 -0500
committermjfernez <mjfernez@gmail.com>2020-02-14 18:35:11 -0500
commitd21e516c4ec3ab5b85f52df9aa7daa7f020b5f7b (patch)
tree6938a6f4b40bd8ac07b84007df0ddf3232045208 /17-Number-Letter-Counts/wordnums.c
parentc9d153b6dafc1018fd7fad08677cade7332e2df0 (diff)
downloadProject_Euler_Solutions-d21e516c4ec3ab5b85f52df9aa7daa7f020b5f7b.tar.gz
Finally figured out 17 in C
Diffstat (limited to '17-Number-Letter-Counts/wordnums.c')
-rw-r--r--17-Number-Letter-Counts/wordnums.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/17-Number-Letter-Counts/wordnums.c b/17-Number-Letter-Counts/wordnums.c
new file mode 100644
index 0000000..e1eaeba
--- /dev/null
+++ b/17-Number-Letter-Counts/wordnums.c
@@ -0,0 +1,103 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+// Problem 17 - Number Letter Counts
+// So I found the string approach to be a pain in the ass in C (see Python solution)
+// But then I realized, hey, I just need the lengths, so you don't have to pass the string!
+const char *ones[10] = {"","one", "two", "three", "four",
+ "five", "six", "seven", "eight", "nine"};
+const char *teens[10] = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
+ "sixteen", "seventeen", "eighteen", "nineteen"};
+const char *tens[10] = {"","", "twenty", "thirty", "forty",
+ "fifty", "sixty", "seventy", "eighty", "ninety"};
+const char nd[4] = "AND";
+
+
+int lengthOfName(char *num) {
+ char *word;
+ // minus 1 for null terminator
+ int digits = strlen(num) - 1;
+ int n = atoi(num);
+ if(digits == 1) {
+ word = (char *) ones[n];
+ printf("%s\n", word);
+ return strlen(word);
+ } else if(digits == 2) {
+ // if the first digit, ie. the tens column is 1
+ if(num[0] == '1'){
+ word = (char *) teens[n % 10];
+ printf("%s\n", word);
+ return strlen(word);
+ }
+ // assuming the first digit is not one, if the second digit is 0
+ else if(num[1] == '0'){
+ word = (char *) tens[n / 10];
+ printf("%s\n", word);
+ return strlen(word);
+ } else {
+ // since the input to the function expects a string,
+ // an extra '\n' is needed
+ char o[2];
+ int on;
+ word = (char *) tens[n / 10];
+ printf("%s", word);
+ memcpy(o, &num[1], 2);
+ on = lengthOfName(o);
+ return (strlen(word) + on);
+ }
+ } else if(digits == 3) {
+ word = (char *) ones[n / 100];
+ printf("%shundred", word);
+ if(num[1] == '0' && num[2] == '0') {
+ printf("\n");
+ return strlen(word) + strlen("hundred");
+ } else {
+ char t[3];
+ int te;
+ strncpy(t, &num[1], 3);
+ printf("%s", nd);
+ te = lengthOfName(t);
+ // example: the user inputs, num = 121
+ // one hundred AND twenty one
+ return (strlen(word) + strlen("hundred") + strlen(nd) + te);
+ }
+ } else if(digits == 4) {
+ word = (char *) ones[n / 1000];
+ printf("%sthousand", word);
+ if(num[1] == '0' && num[2] == '0' && num[3] == '0') {
+ printf("\n");
+ return strlen(word) + strlen("thousand");
+ } /*else {
+ char h[4];
+ int hu;
+ strncpy(h, &num[1], 3);
+ hu = lengthOfName(h);
+ return (strlen(word) + strlen("thousand") + hu);
+ }*/
+ }
+
+ // error condition for debugging, i.e. in case I messed up, return something
+ return -1;
+}
+
+int main() {
+ // 4 is the max for this example, +1 for null terminator or if user tries to cheat
+ char n[5];
+ int out = 0;
+ printf("Number from 1 to 1000: ");
+ fgets(n, 10, stdin);
+ if(atoi(n) > 1000)
+ return printf("only up to 1000 in this example, sorry :(\n");
+ // Test code to make sure the function works
+ //out = lengthOfName(n);
+ //printf("%d Characters... wow you'll hurt your hands typing that!\n", out);
+
+ for(int i = 1; i <= atoi(n); i++){
+ char curr[5];
+ sprintf(curr, "%d\n", i);
+ out += lengthOfName(curr);
+ }
+ printf("Sum of charachters: %d\n", out);
+ return 0;
+}