数组 和 循环 冒泡排序,斐波那契,杨辉三角

5 篇文章 1 订阅

练习题
先来看几道练习题:

1.打印杨辉三角

分析 :
杨辉三角是怎样的一个三角呢 他是这个样子的
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

通过观察我们可以发现,每一个数字是他上面的数字和他上面数字的前面的数字之和。
当然 ,最简单 的方法就是使用二维数组。那么 表达式就可以写出来a[i][j]=a[i-1][j-1]+a[i-1][j]

注意:在初始化的时候应该注意 。这将影响到后面的计算。

代码实现

#include<iostream>
using namespace std;

int main(){
	int a[100][100] = { 0, 1 };
	for (int i = 1; i <= 10; i++){
		//a[i][0] = 1;
		//a[i][i] = 1;
		for (int j = 1; j <= i; j++){
			a[i][j] = a[i - 1][j - 1] + a[i - 1][j];
			cout << a[i][j] << "\t";
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

这个方法是最容易也是最简单的一个方法,在这里 ,我在给出一个方法,使用一位数组,但是 他计算的时候要从后往前计算,至于为什么呢?
有兴趣的人可以下去思考一下

#include<iostream>
using namespace std;
int main(){
	int a[10];
	int len = 10;
	for (int i = 0; i < len; i++){
		a[i] = 1;
		for (int j = i - 1; j >= 1; j--){
			a[j] = a[j] + a[j - 1];
		}
		for (int k = 0; k <= i; k++){
			cout << a[k] << '\t';
		}
		cout << endl;
	}
	system("pause");
	return 0;
}

2.冒泡排序

  冒泡排序 是最常见的一种排序,也是很常考的一种排序,冒泡排序的思想是两两比较,不断循环,直到数组有序,我们知道 ,普通的冒泡排序只是单方向进行。而且不能判断有序时候它是否会停止。
在这里  我给出一个改良版本,第一,他解决了排好序后多余的循环,第二 ,他双向排序,循环次数大大减少
#include<time.h> 
#include<iostream>
using namespace std;

// 冒泡排序(双向)
void swap(int *a, int *b);
void BubbleSort(int a[], int len);
void PrintArray(int arr[], int n);

void swap(int *a, int *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}


void BubbleSort(int a[], int len)
{
	int left, right, flag, i;
	int temp = 0;
	left = 0;
	right = len - 1;
	while (left < right)
	{
		flag = 0;

		for (i = left; i<right; i++) 
		{
			if (a[i] > a[i + 1]) 
			{
				swap(&a[i], &a[i + 1]);
				flag = 1;    
				temp = i;
			}
		}
		right = temp;


		for (i = right; i > left; i--) 
		{
			if (a[i] < a[i - 1])  
			{
				swap(&a[i], &a[i - 1]);
				flag = 1;
				temp = i; 
			}
		}
		left = temp;
		if (!flag){
		break;
		}
			
	}

}

void PrintArray(int arr[], int n){
	for (int i = 0; i < n; i++){
		cout << arr[i] <<' ';
	}
	cout << endl;
}
int main(){
	int a[] = { 2, 4, 46, 99, 7, 3, 4, 0 ,34,65,22,11};
	int len = sizeof(a) / sizeof(a[0]);
	PrintArray(a, len);
	BubbleSort(a, len);
	PrintArray(a, len);
	system("pause");
	return 0;
}

3.斐波那契数列

分析:
1 1 2 3 5 8 13 21 34 55
他的每一位数就等于前面两个数之和。
那么 ,我们就可以定义一个一维数组,他的每一个数的计算表达式就是a[i]=a[i-1]+a[i-2]
我们可以给定前面两个元素的值,从下标为2的位置开始计算。但是不要忘了 ,打印是从下标为0开始。

#include<stdio.h>
int main(){
	int a[20] = { 1, 1 };
	for (int i = 2; i < 20; i++){
		a[i] = a[i - 1] + a[i - 2];
	}
	for (int i = 0; i < 20; i++){
		printf("%d  ", a[i]);
	}
	printf("\n");
	system("pause");
	return 0;
}

4。打印如下数字
1 2 3 4 5 6
12 23 34 45 56
123 234 345 456
1234 2345 3456
12345 23456
123456

分析:总共打印六行 我们可以记录一个数字s
每个数字 第一位用i来表示,最后一位用j来表示。
那么,现在就是找规律 ,i和j
到底初始值和结束值该怎么样定义?
我们会发现,当s=2时,i从1-5
当s=3,i从1-4
当s=4,i从1-3
我们就会发现 我们的i值初始值一直是1,结束值等于n-s+1
那么我们的j=i+s-1

#include<stdio.h>
int main(){
	const int n = 6;
	for (int s = 1; s <= 6; s++){
		for (int i = 1; i <= n - s + 1; i++){
			int j = i + s - 1;
			for (int k = i; k <=j; k++){
				printf("%d", k);
			}
			printf("\t ");
		}
		printf("\n");
	}
		system("pause");
		return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值