[c++]平均成绩、从尾到头打印链表、整数从大到小排序、二分法查找、斐波那契数列

文章目录

    • 算法1 平均成绩
      • 1、题目
      • 2、代码实现
    • 算法2 从尾到头打印链表
      • 1、题目
      • 2、代码实现
    • 算法3 数组-整数从大到小排序
      • 1、实现过程
      • 2、实现代码
      • 3、额外学习VBS
    • 算法4 二分法查找
      • 1、原理
      • 2、代码实现
    • 算法5 斐波那契数列
      • 1、C语言题目
      • 2、代码实现
      • 3、Python
      • 参考

算法1 平均成绩

1、题目

m个人的成绩存放在score数组中,请编写函数fun,它的功能是:

将低于平均分的人作为函数值返回,将低于平均分的分数放在below所指定的函数中。

2、代码实现

/*
题目要求:

m个人的成绩存放在score数组中,请编写函数fun,它的功能是:

将低于平均分的人作为函数值返回,将低于平均分的分数放在below所指定的函数中。

编程思路:
 
  1)平均值就是(A+B+C+D+E+F)/总数项

*/
#include "stdafx.h"

#include 
#include 


int fun(int scoce[], int m, int below[])
{
	int aver = NULL; //平均值
	int k = NULL;    //有几个低于平均成绩的同学

	// 平均值就是(A+B+C+D+E+F)/总数项
	for (int i = 0; i < m; i++)
	{
		aver = aver + scoce[i];
	}
	// 计算平均数
	aver = aver / m;
	
	//返回一个分数最低值
	for (int i = 0; i < m; i++)
	{
		// 对比最低成绩
		if (scoce[i]

算法2 从尾到头打印链表

1、题目

通过《剑指offer 名企面试官精讲典型编程题》看到一道讲解链表的题目。

输入一个链表的头结点,从尾到头反过来打印出每个结点的值

链表定义如下:

	typedef struct _NODE
	{
		T Data;
		_NODE* pNext;
	}NODE, *PNODE;

2、代码实现

书中提到解决问题可以利用栈,“后进先出”的特点实现这种顺序,每经过一个节点的时候,把该节点放到一个栈中。
当遍历完整个链表后,再从栈顶开始逐个输出节点的值。此时输出的节点顺序就已经反转过来了。

栈实现的方式代码如下:

	void  revse_printfAll()
	{
		if (m_pHead == NULL)
		{
			return;
		}
		NODE* pTemp = m_pHead;
		
		// stack 实现
		stack  nodes;
		while (pTemp!=NULL)
		{
			nodes.push(pTemp);
			pTemp = pTemp->pNext;

		}
		while (!nodes.empty())
		{
			pTemp = nodes.top();
			cout << pTemp->Data;
			nodes.pop();
		}
	}

既然可以通过栈,那也可用通过vector来实现的。所以随手查看了一下vector的用法,写出与栈实现类似的代码。

	void  revse_printfAll()
	{
		// vector实现
		printf("\n");
		vector  nodes1;
		while (pTemp != NULL)
		{
			nodes1.push_back(pTemp);
			pTemp = pTemp->pNext;

		}
		while (!nodes1.empty())
		{
			pTemp = nodes1.back();
			cout << pTemp->Data;
			nodes1.pop_back();
		}
	}

算法3 数组-整数从大到小排序

1、实现过程

定义整型数组src,长度为10,初始化为{11,12,47,24,49,69,90,89,18,39}。之后用嵌套for循环比较相邻两个元素的大小,如果前一个元素大于后一个,不做任何操作;反之,相互交换。在交换的过程中需要临时变量暂时存放第一个元素的值,命名为temp。

2、实现代码

  • 选择排序
#include 
using namespace std;


int main()
{
	int src[10] = {11,12,47,24,49,69,90,89,18,39};//一维数组中包含10个整数
	//从大到小排序
	for(int i = 0; i < 10; i++)
	{
		for(int j = i+1; j < 10; j++)
		{
			if(src[i]
  • 冒泡排序
#include 
using namespace std;


int main()
{
	int src[10] = {11,12,47,24,49,69,90,89,18,39};//一维数组中包含10个整数
	//从大到小排序
	for(int i = 0; i < 10; i++)
	{
		for(int j = 0; j < 10 - i - 1; j++)
		{
			if(src[j]

3、额外学习VBS

Sub test()

Dim arr, Select_Sort

arr = Array(5, 8, 5, 2, 9)

' 冒泡排序
For i = 0 To UBound(arr)
    For j = 0 To UBound(arr) - i - 1
        Debug.Print arr(i); "=="; arr(j + 1)
        Debug.Print j; "=="; j + 1
        If arr(j) > arr(j + 1) Then vSwap = arr(j): arr(j) = arr(j + 1): arr(j + 1) = vSwap
    Next
Next
 
For i = 0 To UBound(arr)
    Debug.Print arr(i)
Next
    
    
' 选择排序
Select_Sort = Array(5, 8, 5, 2, 9)

' 选择排序
For i = 0 To UBound(Select_Sort)
    For j = i + 1 To UBound(Select_Sort)
        Debug.Print Select_Sort(i); "=="; Select_Sort(j)
        Debug.Print i; "=="; j
        If Select_Sort(i) > Select_Sort(j) Then vSwap = Select_Sort(i): Select_Sort(i) = Select_Sort(j): Select_Sort(j) = vSwap
    Next
Next
 
For i = 0 To UBound(Select_Sort)
    Debug.Print Select_Sort(i)
Next

End Sub

算法4 二分法查找

1、原理

对于给定值的查找,如果大于该数组的中间元素,下一步在元素值大的区域继续与其中间元素比较;否则下一步在元素值小的区域内继续查找,直到找到目标元素。如果到最后还没有找到,则输出“数组中没有该元素”。

2、代码实现

#include 
using namespace std;

//比较值
int array_039[10]={0,1,2,3,4,5,6,7,8,9};

void binary_search(int left,int right,int value)
{
	int search_index;
	search_index=(left+right)/2;//二分
	if(array_039[search_index]==value)//如果等于二分点值
		cout<<"元素"<array_039[search_index])//大于,往右边移
		binary_search(search_index+1,right,value);
	else if(value>temp;
	binary_search(0,9,temp);

	return 0;
}

算法5 斐波那契数列

1、C语言题目

题目内容:

求斐波那契Fibonacci数列
           求函数f(n)    =  0                   n = 0
                         =  1                   n = 1
                         = f(n-1) + f(n-2)      n > 1

2、代码实现

/*
题目要求:

解法:斐波那契数列的变相考查,总数f(n)=f(n-1)+f(n-2)。
F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

编程思路:
 
//算法:采用倒叙计算方法。递归调用方法慢的原因是重复计算太多,采用从下往上计算方法会明显减少重复。
//首先根据f(0)和f(1)算出f(2), 再根据f(1)和f(2)算出f(3)……依次类推就可以算出第n项了。这种思路的时间复杂度为O(n).

*/


int _tmain(int argc, _TCHAR* argv[])
{
	int m1 = 1;
	int	m2 = 0;
	int	m3 = 0;
	int n = 0;
	int max = 0;

	printf("input month count\n ");
	scanf_s("%d",&max);

	while (n

3、Python

  • 递归
def fibonacci (n) :
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-2) + fibonacci(n-1)
		
fibonacci(5)
  • 非递归
def Fibnacci(n):
    result = [1,1]
    if n <= 1:
        return result[n]
    for i in range(2,n+1):
        result.append(result[i-2]+result[i-1])
    return result[n]

Fibnacci(5)

参考

https://stackoverflow.com/questions/35401864/fibonacci-sequence-while-loop

你可能感兴趣的:(C++,算法)