目录
欧拉计划01
欧拉计划02
欧拉计划03
题目如下:
答案: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的倍数就好
*/
题目如下:
首先我们来认识一下斐波那契数列,斐波那契数列又称“兔子数列”,是指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
题目如下:
那么我们在开始敲代码之前,首先要先确定数据类型。
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
感谢大家的阅读和支持,期待能和大家一起进步。