工学1号馆

home

Project Euler 42–Coded triangle numbers

Wu Yudong    August 20, 2018     欧拉计划   575   

Coded triangle numbers

The nth term of the sequence of triangle numbers is given by, tn = 1/2n(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 = 1/2n(n+1)给出;因此前十个三角形数是:

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …
将一个单词的每个字母分别转化为其在字母表中的顺序并相加,我们可以计算出一个单词的值。例如,单词SKY的值就是 19 + 11 + 25 = 55 = t10。如果一个单词的值是一个三角形数,我们就称这个单词为三角形单词。

在这个16K的文本文件words.txt (右击并选择“目标另存为……”)中包含有将近两千个常用英文单词,这其中有多少个三角形单词?

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

Completed on Wed, 12 Feb 2014, 12:45

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)