The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
By converting each letter in a word to a number corresponding to its alphabetical position and adding these values we form a word value. For example, the word value for SKY is 19 + 11 + 25 = 55 = t10. If the word value is a triangle number then we shall call the word a triangle word.
Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand common English words, how many are triangle words?
原题大意:
三角形数序列中第 n 项的定义是: tn = ½n(n+1); 因此前十个三角形数是:
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
通过将一个单词中每个字母在字母表中的位置值加起来,我们可以将一个单词转换为一个数。例如,单词SKY的值为19 + 11 + 25 = 55 = t10。如果单词的值是一个三角形数,我们称这个单词为三角形单词。
words.txt (右键另存为)是一个16K的文本文件,包含将近两千个常用英语单词。在这个文件中,一共有多少个三角形词?
#include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <stdbool.h> #include <math.h> bool test(int n) { int m; m = (int)sqrt(n * 2); if(m * (m + 1) == 2 * n) return true; else return false; } int count(char * s) { int i = 0; int sum = 0; while(s[i] != '\0') { sum += s[i] - 'A' + 1; i++; } return sum; } void solve(void) { FILE *fp; int i, j, k; char *s, c; int sum = 0; char a[20]; fp = fopen("words.txt", "r"); fseek(fp, 0, SEEK_END); int file_size; file_size = ftell(fp); fseek(fp, 0, SEEK_SET); s = (char*)malloc(file_size * sizeof(char)); fread(s, sizeof(char), file_size, fp); i = j = k = 0; while(i <= file_size) { c = s[i++]; if(!isalpha(c)) { if(c == ',') { j = 0; if(test(count(a))) sum++; memset(a,'\0', 20 * sizeof(char)); } } else { a[j++] = c; } } if(test(count(a))) sum++; memset(a,'\0',20 * sizeof(char)); printf("%d\n",sum); } int main(void) { solve(); return 0; }
Answer:
| 162 |
Completed on Tue, 19 Nov 2013, 03:34