欧拉工程第42题:Coded triangle numbers
来源:互联网 发布:淘宝商城怎么秒杀 编辑:程序博客网 时间:2024/06/08 05:26
题目链接:https://projecteuler.net/problem=42
三角形数序列中第 n 项的定义是: tn = ½n(n+1)
26个字母对应其依次出现的顺序,如A:1,B:2
如果一个单词,各个字母对应数字之和在三角形数序列中,则这个单词是三角形单词。
求给的txt文件中有多少个单词
思路:
1.读取txt文件
2.判断是否是三角形单词
3.统计个数
如何判断是三角形单词?
1.求出单词对于的数是多少,这个比较简单
2.判断这个数是否在三角形数序列中
如何判断一个数是在三角形序列中?
1.暴力破解
对1到n的数分别求½n(n+1) 若等于所要判定的数,则是三角形数。
太暴力,时间长,本题让判断的数有2000左右的。
2.巧解
tn = ½n(n+1),我们假设输入的数num是三角形数,则num= ½n(n+1),根据这个我们可以求出n,再判断n对于的真实的三角形数tn是否等于num,等于则是三角形数。
或
这个也可以,比方法一好多了
3.不直接求n
num= ½n(n+1)
2*num=n*n+n
看到这个式子,突然感觉当n趋向无穷大时候 2*num = n * n
2*num = n * n 是关键
所有 n=sqrt(2*num) 四舍五入
这里的问题要是n是很大的数才满足条件
手工试了下,发现n=1到10都满足。为什么?
我们可以考虑下面两个数的关系,左边的是我们认为的n,右边实际的n,假设小于
化简后:
0<1-2
2
假设错误
这个还不足以说明问题,注意到我们用到了四舍五入,下面证明
两边平方后整理:1>0
即:
所有再加上四舍五入
Java代码:
package projecteuler41to50;import java.io.BufferedReader;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import java.util.Date;class level42{ void solve() throws IOException{ int result=0; String filename="src\\projecteuler41to50\\p042_words.txt"; String[] WordString=ReadTxt(filename); for(int i=0;i<WordString.length;i++){ String word=WordString[i]; int wordTonum=WordToNumber(word); if(isTriang(wordTonum)==true){ result+=1; } } System.out.println("result:"+result); } int WordToNumber(String Word){ int sum=0; for(int i=0;i<Word.length();++i){ String letter=Word.substring(i, i+1); sum+=LetterToNumber(letter); } return sum; } boolean isTriang(int tn){ int n=(int)Math.sqrt(2*tn); if(n*(n+1)==2*tn) return true; return false; } int LetterToNumber(String letter){ letter=letter.toLowerCase(); return letter.hashCode()-"a".hashCode()+1; } String[] ReadTxt(String filename) throws IOException{ File fl=new File(filename); BufferedReader reader=null; String tempString=null; String WordString=""; String[] WordArray; try { reader=new BufferedReader(new FileReader(fl)); while((tempString=reader.readLine())!=null){ WordString+=tempString; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } WordString=WordString.replaceAll("\"", ""); WordArray=WordString.split(","); return WordArray; }}public class Problem42 { public static void main(String[] args) throws IOException{ Date beginTime=new Date(); new level42().solve(); Date endTime=new Date(); Long Time=endTime.getTime()-beginTime.getTime(); System.out.println("Time:"+Time/1000+"s"+Time%1000+"ms"); }}
- 欧拉工程第42题:Coded triangle numbers
- Project Euler:Problem 42 Coded triangle numbers
- 欧拉工程第21题:Amicable numbers
- 欧拉工程第44题:Pentagon numbers
- Problem 42 Coded triangle numbers(ifstream +getline)
- 欧拉工程第11题
- 欧拉工程第12题
- 欧拉工程第13题
- 欧拉工程第14题
- 欧拉工程第15题
- 欧拉工程第16题
- 欧拉工程第17题
- 欧拉工程第18题
- 欧拉工程第19题
- 欧拉工程第20题
- 欧拉项目 第21题 Amicable numbers
- 欧拉工程第22题:Names scores
- 欧拉工程第23题:Non-abundant sums
- 综合设计ui 彩票设计设置界面
- ...is not allowed to connect to this MySql server,解决办法。
- 小组项目演示后的反思0525
- Delphi中的INI文件编程 (转)
- 双硬盘装系统引导分区问题
- 欧拉工程第42题:Coded triangle numbers
- linux开机自启动脚本
- 栈的实现
- mark
- mysql 存储过程详解
- hdu 2181 哈密顿绕行世界问题
- sql存储过程insert 后的错误检查很重要。否则出错前台无法知道
- 进口奶粉清关案例 奶粉进口清关案例
- CentOS下安装svn,添加新用户,重启svn服务