素数大酬宾c语言,第五单元 数组

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( );.

数组感受:

使用数组能更容易的解决需要输入大量数据的问题,尤其是二维数组与矩阵结合在一起,使得程序设计与自己所学的高代紧密联系在了一起。本以为学了数组能简单些,却与之相反,感觉难度一下就上来了,写个程序需要写好多好多条语句,思路不清晰根本写不出来,所以写程序时一定要耐得住性子,坚持下去。给自己加油!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值