[Project Euler] 来做欧拉项目练习题吧: 题目012

周银辉

问题描述:

The sequence of triangle numbers is generated by adding the natural numbers. So the 7thtriangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. The first ten terms would be:

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

Let us list the factors of the first seven triangle numbers:

 1: 1
 3: 1,3
 6: 1,2,3,6
10: 1,2,5,10
15: 1,3,5,15
21: 1,3,7,21
28: 1,2,4,7,14,28

We can see that 28 is the first triangle number to have over five divisors.

What is the value of the first triangle number to have over five hundred divisors?

问题分析:

题目要求找出第一个拥有超过500个约数的三角数。

首先,求第i个三角数很容易,其是1~i之和

long get_trangle_number(int i)
{
return ((long)(1+i)*i)/2;
}

难在如何求一个数n的约数,观察 28: 1,2,4,7,14,28 除了1和28(n本身)外,其它约数中,关键约数是2和7,剩下的则是关键约数的倍数

所以,先求出关键的这些约数,然后再求约数的倍数,而关键的约数也就是质因数(prime factor),求一个数的质因数参考003题。

get_divisors_count这个函数是上述算法的粗糙版本,

int get_divisors_count(int number)
{
if(number<1)
{
return 1;
}
int count     = 0;
int factor    = 2;
int n         = number;
int buffer_sz = number+1;
int i;
int array[buffer_sz];
for(i=0; i<buffer_sz; i++)
{
array[i]=0;
}
array[1]      = 1;
array[number] = 1;
while(n>1)
{
if(n%factor==0)
{
//printf("prime factor found: %d\n", factor);
array[factor]=1;
i=2;
while(number%(i*factor)==0)
{
array[i*factor]=1;
i++;
}
while(n%factor==0)
{
n/=factor;
}
}
factor++;
}
        //printf("divisors of %d: ", number);
for(i=0; i<buffer_sz; i++)
{
if(array[i]==1)
{
//printf("%d ", i);
count++;
}
}
return count;

}

其中有个问题是如何记录已经找到的约数,由于有可能存在重复查找(比如14是2的倍数也是7的倍数,所以重复查找了)则不能简单地累计,

要记录这些数,最简单的方法是用hashtable之类的,但标准C里面没有内置,所以我用了一个数组,数组下标表示约数,值为1则表示找到了。

数组对于比较小的数没问题,但数太大的话,一是遍历是效率低下,二是如果在栈上分配的容易导致内存错误。

上述方法是可以改进的,然后得到了get_divisors_count2这个函数,理论基础来自于这里:http://mathforum.org/library/drmath/view/55843.html

于是我们得到更高效的函数:

int get_divisors_count2(long number)
{
if(number<1)
{
return 1;
}
int count     = 1;
int factor    = 2;
long n        = number;
int i, t;
while(n>1)
{
if(n%factor==0)
{
//printf("prime factor found: %d\n", factor);
t = 1;
while(n%factor==0)
{
t++;
n/=factor;
}
count *= t;
}
factor++;
}
return count;
}

注:当完成题目后,对于某些题,官方网站会给出参考答案,在我的博客里不会将官方答案贴出来,仅仅会写下我自己当时的思路,除非两者不谋而合。另外,如果你有更好的思路,请留言告诉我,我非常乐意参与到讨论中来。

转载于:https://www.cnblogs.com/zhouyinhui/archive/2011/02/16/1955691.html

[Project Euler] 来做欧拉项目练习题吧: 题目012相关推荐

  1. [Project Euler] 来做欧拉项目练习题吧: 题目004

        [Project Euler] 来做欧拉项目练习题吧: 题目004 周银辉 问题描述: A palindromic number reads the same both ways. The l ...

  2. [Project Euler] 来做欧拉项目练习题吧: 题目017

    [Project Euler] 来做欧拉项目练习题吧: 题目017 周银辉 题目描述: If the numbers 1 to 5 are written out in words: one, two ...

  3. [Project Euler] 来做欧拉项目练习题吧: 题目013

    问题描述: Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. 371072 ...

  4. 鸿蒙之后华为把欧拉也捐了,还承诺不做欧拉商用发行版

    梦晨 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为又搞了几个大动作: 第一,正式把欧拉开源操作系统捐赠给开放原子开源基金会. 第二,宣布欧拉和鸿蒙已实现内核技术共享,明年3月发布的欧拉版 ...

  5. 常微分方程解法:Euler‘s Method 欧拉方法

    常微分方程的解法 (一): 常微分方程的离散化 :差商近似导数.数值积分方法.Taylor 多项式近似 Euler's Method 欧拉方法 常微分方程的解法 (二): 欧拉(Euler)方法

  6. HDU6322 Problem D. Euler Function【欧拉函数+数学规律】

    Problem D. Euler Function Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 524288/524288 K (Java ...

  7. (不会还有人不会做欧拉方程吧)考研数学中的欧拉方程

    具有如下结构的变系数线性微分方程被称为欧拉方程: f(x)=xny(n)+a1xn−1y(n−1)+...+an−1xy′+any.f(x) = x^{n}y^{(n)}+a_1x^{n-1}y^{( ...

  8. 欧拉项目第三题之最大质数因子

    13195的质数因子有5,7,13和29. 600851475143的最大质数因子是多少? 这里可以肯定的是:1.数字很大,绝对不能暴力.2.如果这是一到OJ题,那么我们的目的就是尽量缩小这个数,减少 ...

  9. [Project Euler]加入欧拉 Problem 9

    A Pythagorean triplet is a set of three natural numbers, a b c, for which, a2 + b2 = c2 For example, ...

最新文章

  1. Java学习总结:55(偶对象保存:Map接口)
  2. Spring MVC同一方法返回JSON/XML格式
  3. 秒过,度目智慧通行让常态化防疫更高效
  4. spark之4:基础指南(源自官方文档)
  5. 递归算法的时间复杂度分析
  6. Linux 基础知识系列第一篇
  7. java 图形化技术 哪个好_纳滤和反渗透技术哪个好?
  8. 如何在Go中找到一个对象的类型?
  9. highslide图片查看特效
  10. 安装mysql客户端
  11. mac能开发android吗,怎么在Mac上开发Android应用
  12. Kylo调研总结(一)
  13. ILSVRC竞赛详细介绍(ImageNet Large Scale Visual Recognition Challenge)
  14. leetcode 5390. 数青蛙(C++)
  15. WordPress插件 引流吸粉到微信公众号 提高用户关注量
  16. 最高人民法院 最高人民检察院 关于办理非法利用信息网络、帮助信息网络犯罪活动等刑事案件适用法律若干问题的解释(重点学习标注)...
  17. 科罗拉多州立大学计算机科学,2019上海软科世界一流学科排名计算机科学与工程专业排名科罗拉多州立大学排名第401-500...
  18. Linux-虚拟网络设备-LinuxBridge
  19. 网页游戏常见外挂原理及防御
  20. 计蒜客习题:猴子打字

热门文章

  1. java io-File
  2. 翼城中学2021高考成绩查询,临汾中考分数线预测2021
  3. 小白科普:分布式和集群
  4. 央采数据库集采:甲骨文、微软、腾讯、阿里等 21 家中标
  5. Myeclipse学习总结(4)——Eclipse常用开发插件
  6. 50道编程小题目之【质数的个数】
  7. render在python中的含义_python面试中常见易混淆概念
  8. 开环控制的两轮差速驱动小车_汽车的差速器、差速锁有什么不同?很多车主容易把它俩搞混...
  9. Python Day42
  10. DG SG childSG fatherSG