# 工学1号馆

home

## Project Euler 42–Coded triangle numbers

Wu Yudong    August 20, 2018     欧拉计划   620

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?

1, 3, 6, 10, 15, 21, 28, 36, 45, 55, …

//（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));

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;
}