4.4 课后习题与实验(3)
习题 4-4
斐波那契数列(洛谷P1720)
观察下面的数列:1 1 2 3 5 8 13 21 34 55 89 144 233 ... 除了最开始的两个数字,后面的数字都是前面两个数字的和,这就是斐波那契数列。
请输出前 n(n<= 30)项斐波那契数列。
解答
#include<iostream>
using namespace std;
int main()
{
long long a1=1,a2=1,a3=0,n;
cin>>n;
if(n>=1)
cout<<a1;
if(n>=2)
cout<<' '<<a2;
if(n>=3)
{
for(int i=3;i<=n;i++)
{
a3=a1+a2;
cout<<' '<<a3;
a1=a2;
a2=a3;
}
}
return 0;
}
洛谷里面是求第几个数,解答如下:
#include<iostream>
#include <iomanip>
using namespace std;
int main()
{
long long a1=1,a2=1,a3=0,n;
cin>>n;
if(n==1)
cout<<setprecision(2)<<fixed<<a1*1.0;
else if(n==2)
cout<<setprecision(2)<<fixed<<a2*1.0;
else
{
for(int i=3;i<=n;i++)
{
a3=a1+a2;
a1=a2;
a2=a3;
}
cout<<setprecision(2)<<fixed<<a3*1.0;
}
return 0;
}
习题 4-5
求极差(洛谷P5724)
给出 n(n≤100) 和 n 个整数
$ a_i(0≤a_i≤1000) $,求这 n 个整数中的极差是什么。
极差的意思是一组数中的最大值减去最小值的差。
解答
#include<iostream>
using namespace std;
int main()
{
int n,a,zd=0,zx=1000;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a>zd) zd=a;
if(a<zx) zx=a;
}
cout<<zd-zx;
return 0;
}
习题 4-6
最长连号(洛谷P1420)
输入 n 个正整数,要求输出最长的连号的长度。
连号指从小到大连续自然数。
输入格式
1.第一行,一个整数 n。
第二行,n 个整数
$a_i$,之间用空格隔开。
输出格式
一个数,最长连号的个数。
输入输出样例
| 输入 | 输出 |
|---|---|
103 5 6 2 3 4 5 6 8 9 |
5 |
解答
#include<iostream>
using namespace std;
int main()
{
int n,a2=-1,a1=-1,c=0,cmax=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a2;
if(a2==a1+1) c++;
else c=0;
a1=a2;
if(c>cmax)
cmax=c;
}
cout<<cmax+1;
return 0;
}
习题 4-7
质因数分解(洛谷P1075,NOIP2012普及组)
已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入格式
一个正整数n。
输出格式
一个正整数p,即较大的那个质数。
输入输出样例
| 输入 | 输出 |
|---|---|
21 |
7 |
说明/提示
$ n≤2×10^9$
NOIP 2012 普及组 第一题
解答
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,flag1,flag2;
cin>>n;
for(int i=sqrt(n);i>1;i--)
{
if(n%i>0)
continue;
//其实我不知道为什么不用判断质数
// flag1=1;
// for(int j=2;j<i;j++)
// {
// if(i%j==0)
// {
// flag1=0;
// break;
// }
// }
// int num = n/i;
// flag2=1;
// for(int j=2;j<num;j++)
// {
// if(num%j==0)
// {
// flag2=0;
// break;
// }
// }
//if(flag1&&flag2)
//{
cout<<n/i;
break;
//}
}
return 0;
}
博主的个人网站:https://codespark.cn/

浙公网安备 33010602011771号