`

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

#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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics