printf("%d",f[i]);
printf("%d\n",f[n]);
return 0;
}
2.例幸运数的划分
【问题分析】
分析发现,1~1000范围内的幸运数只有14个。于是,将这14个·幸运数直接存储到一个数组lucky中,再穷举判断其中有没有一个数能整除。
#include
using namespace std;
int main()
{
int n,lucky[14]={4,7,44,47,74,77,444,447,
474,477,744,747,774,777};
scanf("%d",&n);
bool flaq=flase;
for (int i=0;i<14;i++)
if (n%lucky[i]==0)
flag=true;
if(flag)
printf("YES\n");
else printf("NO\n");
return 0;
}
第三课 一维数组的插入删除
插入一个元素需要先找到插入的位置(假设下标为x),将这个元素及其之后的所有元素依次往后移一位,(注意要从后往前进行操作),再将给定的元素插入(覆盖)到位置x。
删除某一个元素,也需要先找到删除的位置,假设下标为x,将下标为x+1及其之后的所有元素依次向前移一位,覆盖原来位置的元素。
注意:插入操作需要注意把数组下标定义的足够大。
第四课 一维数组的查找统计
顺序查找和二分查找
顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。
如果数组中的元素是有序的(递增或者递减),也可以采用二分查找,二分查找又称折半查找,其优点是比较次数少,查找速度快。比较Log2的n次方次。
统计问题
全局统计可以定义变量时赋初值。
局部统计必须在统计开始之前赋初值。
第五课 一维数组的元素排序
最基本的三种:选择排序,冒泡排序和插入排序。
选择排序基本思想:每一趟从待排序的数据中,通过打擂台比较选出最小元素放在这些数据的最前面。
冒泡排序基本思想:从第一个数开始依次不断比较相邻的两个元素,如果“逆序”就交换这样一趟排序结束后最大的元素就放在了第二个位置。
优化:如果一趟排序下来,都没有任何 逆序 数对,即没有发生交换操作,则说明已经排好序了,此时就可以立刻退出循环。
插入排序基本思想:把所有待排序元素分成前后两段,前一段是已经排好序的,后一段是待排序的,每一趟都是把后一段的第一个数插入到前一段的某一个位置,保证前一段仍然是有序的。
第六课 一维数组的应用举例
桶排序:分析数据,数据虽然很多,但是数据范围比较小,这种情况下可以使用桶排序。
例:商品排序
某商场的仓库中有n件商品,每件商品的价格在0到1000之间,价格为0的商品为赠品。现在商场经理要求将这n件商品按价格由低到高排序,请编程输出n件商品排序后的情况。
输入格式
第一行一个正整数n,表示有n件商品,1<=n<=100000
接下的n行,每行一个整数,表示第i件商品的价格。
输出格式
n行,每行输出一个整数。
#include
using namespace std;
int n,i,j, number , num[1001] ;
int main() {
cin >> n;
for(i = 1; i<= n; i++){
cin >> number ;
num[number]++;//记录整数number出现的次数
}
for(j = 1; j <= num[i]; j++)
cout << i
}
(下标描述价格)
穷举法
穷举商品编号2~n,判断每个编号是否为素数,这种方法效率不高,一旦n过大,程序就会超时。
筛选法
筛选法又称为筛法,相比穷举法筛选法的效率更高。
例:筛选法,素数大酬宾
某商场的仓库中有n种商品,每件商品按1~n依次排序。现在商场经理突发奇想,决定将编号为素数的所有商品拿出来搞优惠酬宾活动,请编程帮助仓库管理员将编号为素数的商品选出来。
输入:一行一个正整数n,表示有n种商品,2<=n<=100000
输出一行若干个正整数,表示若干种商品编号,且每个编号均为素数,请从小到大输出,每两个数之间有一个空格。
#include
#include
using namespace std;
int n,i,j, number , num[1001] ;
int main() {
int n,i, j;
bool p[100001];
for(i = 0; i <= 100000; i++) p[i] = true;
p[1] = false; (先进行预处理)
cin>> n ;
cout<<2;
for(i = 2; i <= sqrt(n) ; i++)
if(p[i])
for(j = 2; i*j <= n; j++) p[i*j]=false;
for(i= 3; i <= n; i++)
if(p[i]) cout <
cout
}
第七课 二维数组的定义和操作
一维数组的元素可以是任何基本数据类型,也可以是结构体,那么如果一维数组的每一个元素又是一个一维数组,则称这种数组为"二维数组"。
格式:
类型标识符 数组名 [常量表达式1][常量表达式2]
在定义二维数组时,可以省略第一维的大小,但是第二维的大小不能省略。例如,
int a[ ][4]={1,2,3,4,5,6,7,9,20,11,12}
二维数组的存储及元素引用
二维数组的存储方式是"行优先"的连续存储,先逐个存储第0行上的元素,在逐个存储第一行上的元素。
第八课二维数组应用举例
例:变换的矩阵
描述
有一个N x N(N为奇数,且1 <= N <= 10)的矩阵,矩阵中的元素都是字符。这个矩阵可能会按照如下的几种变幻法则之一进行变幻(只会变幻一次)。
现在给出一个原始的矩阵,和一个变幻后的矩阵,请编写一个程序,来判定原始矩阵是按照哪一种法则变幻为目标矩阵的。
1. 按照顺时针方向旋转90度;
如:
1 2 3 7 4 1
4 5 6 变幻为 8 5 2
7 8 9 9 6 3
2. 按照逆时针方向旋转90度;
如:
1 2 3 3 6 9
4 5 6 变幻为 2 5 8
7 8 9 1 4 7
3. 中央元素不变(如下例中的 5),其他元素(如下例中的3)与“以中央元素为中心的对应元素”(如下例中的7)互换;
如:
1 2 3 9 8 7
4 5 6 变幻为 6 5 4
7 8 9 3 2 1
4. 保持原始矩阵,不变幻;
5. 如果 从原始矩阵 到 目标矩阵 的变幻,不符合任何上述变幻,请输出5
输入
第一行:矩阵每行/列元素的个数 N;
第二行到第N+1行:原始矩阵,共N行,每行N个字符;
第N+2行到第2*N+1行:目标矩阵,共N行,每行N个字符;
输出
只有一行,从原始矩阵 到 目标矩阵 的所采取的 变幻法则的编号。
样例输入
5
a b c d e
f g h i j
k l m n o
p q r s t
u v w x y
y x w v u
t s r q p
o n m l k
j i h g f
e d c b a
样例输出
3
解答
#include
using namespace std;
int main(){
char a[11][11],b[11][11];
int i,j,k,l,n,e;
cin>>n;
for(i=0; ifor(j=0; jcin>>a[i][j];
for(i=0; ifor(j=0; jcin>>b[i][j];
e=0;
for(i=0,k=n-1; ifor(j=0,l=0; j{ if(a[i][j]==b[l][k]) e++; }
if(e==n*n)
{ cout << "1" << endl;
return 0; }
e=0;
for(i=0,k=0; ifor(j=0,l=n-1; j{ if(a[i][j]==b[l][k])
e++; }
if(e==n*n)
{ cout << "2" << endl; return 0; }
e=0;
for(i=0,k=n-1; ifor(j=0,l=n-1; j{ if(a[i][j]==b[k][l]) e++; }
if(e==n*n)
{ cout << "3" << endl; return 0; }
e=0;
for(i=0,k=0; ifor(j=0,l=0; j{ if(a[i][j]==b[k][l]) e++; }
if(e==n*n)
{ cout << "4" << endl; return 0; }
cout << "5" << endl; return 0; }
第九课 数字方阵
数字方阵就是一个行列数相等的二维数组,其中的每个元素都是数字。解决数字方阵一般两种方法:解析法和模拟法。
解析法就是找出每一个方阵元素f[i][j]与i,j和数组规模n的通项公式,然后直接用两重循环给数组元素赋值相对比较容易,一般用在初始化等场合。
模拟法就是把数字方阵看成一个动态的填数过程,把n的二次方个数依次填入数组中,每填好一个数就定为好下一个数的位置i和j。
例:
描述
用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。
蛇形填充方法为:
对于每一条左下-右上的斜线,从左上到右下依次编号1,2,...,2n-1;按编号从小到大的顺序,将数字从小到大填入各条斜线,其中编号为奇数的从左下向右上填写,编号为偶数的从右上到左下填写。
比如n=4时,方阵填充为如下形式:
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
输入
输入一个不大于10的正整数n,表示方阵的行数。
输出
输出该方阵,相邻两个元素之间用单个空格间隔。
样例输入
4
样例输出
1 2 6 7
3 5 8 13
4 9 12 14
10 11 15 16
#include
using namespace std;
int main() {
int n, i, j, x=1;
int a[10][10]={0};
cin >> n;
for(i=0;i<=2*n-2;i++){
for(j=i;j>=0;j--){
if(jif(i%2!=0)
a[i-j][j] = x++;
else
a[j][i-j] = x++; } } }
for(i=0;ifor(j=0;jcout << a[i][j] << " ";
cout << endl; }
return 0;
}
第十课 字符数组
给字符数组赋值的方法很多,例如:
用scanf读人整个数组:scanf( "%s",letter);
用scanf逐个元素读入:scanf("%c",&letter[0]);
用cin输人整个数组:cin >> letter;
用cin逐个元素输入:cin >> letter[0];
用gets读人整个数组:gets (letter);
用gelchar逐个读入:letter[ 0 ]=getchar( );.
数组感受:
使用数组能更容易的解决需要输入大量数据的问题,尤其是二维数组与矩阵结合在一起,使得程序设计与自己所学的高代紧密联系在了一起。本以为学了数组能简单些,却与之相反,感觉难度一下就上来了,写个程序需要写好多好多条语句,思路不清晰根本写不出来,所以写程序时一定要耐得住性子,坚持下去。给自己加油!