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$,之间用空格隔开。

输出格式

一个数,最长连号的个数。

输入输出样例

输入 输出
10
3 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;
} 
posted @ 2021-05-04 16:37  CodeSpark  阅读(199)  评论(0)    收藏  举报