(Problem 42)Coded triangle numbers

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的文本文件,包含将近两千个常用英语单词。在这个文件中,一共有多少个三角形词?

//(Problem 42)Coded triangle numbers
// Completed on Tue, 19 Nov 2013, 03:34
// Language: C11
//
// 版权所有(C)acutus   (mail: acutus@126.com) 
// 博客地址:http://www.cnblogs.com/acutus/
#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

 

posted @ 2014-02-20 00:12  acutus  阅读(344)  评论(0编辑  收藏  举报
TOP