欧拉计划1-3题答案&代码&注释

目录

欧拉计划01

欧拉计划02

欧拉计划03


欧拉计划01

题目如下:

欧拉计划1-3题答案&代码&注释_第1张图片

答案:233168

这道题比较简单,代码如下,和注释一起食用更佳!

#include 
int main(void)
{
	int a=1,c=0;       //创建变量a , c 
	while(a<1000)        //a小于1000时开始循环 
	{
		if(a%3==0||a%5==0)    //判断1000以内每一个3或5的倍数 加到c中 
		{
			c += a;
			a++;   
		}
		else
		{
			a++;
		}
	}
	printf("1000以内3与5的倍数和为:%d",c);  //打印 c(1000以内每一个3或5倍数的总和) 
	return 0;
 } 
/*
总结: 注意3和5的公倍数 只能加一次。
     如:15  可能会因代码不当相加两次
	 所以最好不分开计算3和5的倍数
	 用  || 来判断3或5的倍数就好 
*/

欧拉计划02

题目如下:

欧拉计划1-3题答案&代码&注释_第2张图片

 首先我们来认识一下斐波那契数列,斐波那契数列又称“兔子数列”,是指1、1、2、3、5、8、13

等数字组成的数列。我们可以看出,从第三项开始,每一项都是前两项之和

我们有2种常用的方法来用代码实现斐波那契数列。

1.循环

int i; //先定义一个循环变量i 用于控制for循环的次数
int n;//用n来保存用户需要求第几项斐波那契数列
int f1,f2,f3;//分别表示第n项 第n-1项 第n-2项斐波那契数列

//因为斐波那契数列从第三项开始就为前两项之和 所以对f1和f2的初始化是极其重要的
f1 = f2 = f3 = 1;  //之所以对f3初始化 是为了让用户求第一项和第二项斐波那契数列时直接输出1

for (i=3 ;i<=n; i++) //我们循环相加从第三项开始 也就是i=3开始 计算到第n项
{
    f3 = f1+f2    //第i项 等于前两项之和
    f1 = f2;     //之后把第二项的值赋给原第一项
    f2 = f3;     //把第三项的值赋给原第二项 好进行下一次循环的计算
}
printf("第n项斐波那契数列是:%d\n", n, f3); //当n为1或2时会直接跳过循环打印1 
                                           //大于2时会循环后再打印

2.递归

像斐波那契数列这种分情况且规律极其单一的数列来说,递归是非常好的一个解决方法。

递归的思想可以理解为套娃。递归递归,有递便有归,问题就如同套娃中最外层的娃娃,

一层一层往里面拆,拆到最后一层后开始把结果一步一步返回,再把娃套回去。

对于斐波那契数列,我们可以分为两种情况(F(n)代表第n项斐波那契数列 n只能为正整数):

1. n<=2 时 F(n) = 1;      2.  n>2时 F(n) = F(n-1) + F(n-2)

int Fn(int n)
{
    if (n<=2)
        return 1;
    else 
        return Fn(n-1)+F(n-2);
}

以上就是递归解决斐波那契数列的方式。

那么我们再回到问题本身,既然解决了斐波那契数列,那么我们只需要循环判断当前项

是否为偶数项,true则加到求和变量中去,false则进行下一次循环。

int main(void)
{
	int f1,f2,f3; //存储斐波那契数
    int sum = 0;  //偶数和求和变量
    f1 = f2 = f3 = 1;  //变量初始化

    while (f3<=4000000)  //在小于四百万的项中进行循环判断
    {
        f3 = f1+f2;
        f1 = f2;
        f2 = f3;
        if (f3%2 == 0)  //如果当前斐波那契数为偶数(对2取余为0)
            sum += f3;  //加到求和变量中
    }

	printf("偶数和为%d",sum);   //输出不超过4000000的斐波那契数列偶数和 
	return 0;
}

答案:4613732

欧拉计划03

题目如下:

欧拉计划1-3题答案&代码&注释_第3张图片

 那么我们在开始敲代码之前,首先要先确定数据类型。

600851475143明显超出了整型的范畴,所以我们首先要用longlong(int64)来存储。

何为质数?质数也是素数,可以简单的理解为只能被1和它自身整除的数,如:2,3,5......

那么质因数顾名思义就是一个数的因数 且这个因数为质数。

很容易想到的方法就是用一个循环遍历来求600851475143的因数,

并再嵌套一个循环判断此因数是否为质数,用max变量来存储最大的质因数。

虽然这个方法是可行的,但是程序的计算量很大,运行时间会比较慢,有没有更简单的方法呢?

既然它是质因数,那么就没有子因数,也就是说,我们可以从不断削减600851475143的因数这方面来考虑。

long long num = 600851475143;

int i; //循环变量
i = 2;

while (i!=num)  //i从2开始 只要i能被num整除  那就代表i是num的因数 我就用num不断除以这个因数
{
    if (num%i==0)   //直到当前的i不在是num的因数之后 执行i++
        num /= i;   
    else i++;     //当num为一个除了1和本身没有其他因数的值后  i便会慢慢自增到与num等值
}                   //此时的num便是原本它自己的最大质因数
printf("%d", num);  //i与num相等时就可以跳出循环 输出num

答案:6857

感谢大家的阅读和支持,期待能和大家一起进步。

你可能感兴趣的:(算法,c语言)