练习题
先来看几道练习题:
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;
}