三角数のn項は t_n = 1/2*n(n+1)で与えられる. 最初の10項は
1, 3, 6, 10, 15, 21, 28, 36, 45, 55, ...
である.
単語中のアルファベットを数値に変換した後に和をとる. この和を「単語の値」と呼ぶことにする. 例えば SKY は 19 + 11 + 25 = 55 = t_10である. 単語の値が三角数であるとき, その単語を三角語と呼ぶ.
16Kのテキストファイル word.txt 中に約2000語の英単語が記されている. 三角語はいくつあるか?
#include <iostream>
#include <fstream>
#include <string>
#include <boost/algorithm/string.hpp>
using namespace std;
int tri[20];
bool is_member(int n){
for(int i=0 ; i<20 ; i++){
if(tri[i] == n) return true;
}
return false;
}
int main(){
deque<string> dat,dat2;
ifstream ifs("dat042.txt");
string str;
for(int i=0 ; i<20 ; i++){
tri[i] = i*(i+1)/2;
}
ifs >> str;
dat.push_back(str);
boost::algorithm::split(dat, str, boost::is_any_of("\","));
for(int i=0 ; i<(signed)dat.size() ; i++){
if(dat[i]!="") dat2.push_back(dat[i]);
}
int num=0;
int k;
char c;
for(int i=0 ;i<dat2.size() ; i++){
k=0;
for(int j=0 ; j<(signed)dat2[i].size() ; j++){
c = dat2[i].at(j);
k += c-64;
}
if(is_member(k)) num++;
}
cout << num << endl;
int end;
cin >> end;
}
いやぁこれはひどい。is_memberってvectorとかにありそうなもんだけど、見つけられなかった・・・