文章目录
一、斐波那契数列
由f(n)=f(n-1)+f(n-2)可知,只需要保存一个数据的前两项,就可以求出本数据。
通过枚举,保存n-2次数据,就能求出f(n)
代码
二、曼哈顿距离解决菱形构造问题
1.什么是曼哈顿距离
横坐标差的绝对值与纵坐标差的绝对值之和。
所有打星的地方是曼哈顿距离小于等于2的地方。格子为5乘5。
三、循环优化问题
1.c++默认1秒执行1亿次
题目:
理解:找一个1亿位数据的所有约数,一个数据需要循环1亿次,100个需要100亿次,打破了c++规则
2.被除数与约数的关系。
约数=被除数/除数 或者 约数=被除数/(上一个约数)
例如:被除数12 除数2 约数=12/2=6 约数=12/6=2
则通过这个规律,就可以枚举出所有较小的约数,就能找到较大的约数。
小约数<大约数
约数<被除数/约数
约数<根号下被除数
根据题目被除数1亿位,开根号后,1万位。最多100个被除数,100万次计算,满足c++规则。
3.实现
只需要在根号下被除数中寻找约数。
避免36,49这种(两个约数一样)。
较大的约数在判断前需要排除上述情况
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int data;
cin>>data;
int sum=0;
//
for(int i=1;i<sqrt(data);i++)
{
if(data%i==0)
{
sum+=i;
//排除 36 49
if(data!=(data/i))
{
sum+=data/i;
}
}
}
//
if(sum==data) cout<<data<<" is perfect"<<endl;
else cout<<data<<" is not perfect"<<endl;
}
return 0;
}
4.讲解思路
d为约数,x为被除数。
四、接受数值且以最后数值为0结束的while循环
1.举例
使用了逗号表达式,值等于最后一个数的值。