c语言中数组中找质数,07 重忆C之 数组

数组索引

int radius[3];

radius[1] = 2; %为第二个元素赋值2

这样声明个数组,名为radius,含3个int型元素。

我们可通过radius[0],radius[1],radius[2]使用元素,序号也可以是表达式。

50beb04506f3

数组

第一个元素的索引是 0 而不是 1相应的,

一个长度为 n 的数组,它的最后一个元素是n-1而不是n

初始化

int b[2] = {5, 8}; %要用大括号。最后一个序号是 2-1=1

int b[2] = {5, 8}; %可以不说长度

过筛法找质数

#include

int main() {

int n = 15;

int mark[16] = {

1, 1, 0, 0,

0, 0, 0, 0,

0, 0, 0, 0,

0, 0, 0, 0

};

int c;

int j;

for (c = 2; c * c <= n; c++) {

if (mark[c] != 1) {

for (j = 2; j <= n / c; j++) {

mark[c * j] = 1;

}

}

}

for (c = 2; c <= n; c++) {

if (mark[c] != 1) {

printf("%d\n", c);

}

}

return 0;

}

数组元素查找

顺序查找

对于一个数组,如果我们查找的元素是我们指定的查找顺序最后一个会被访问的元素,或者这个元素完全不在这个数组中,我们就会遭遇到最差的情况——依次访问到数组中每一个元素。

50beb04506f3

顺序查找

折半查找

而对于一个元素随索引增大而增大排列的数组,可以直接看中间数再判断:

1.如果这个数是我们要找的,则我们得到了结果。

2.如果我们需要查找的数比它大,我们则可以直接放弃比它小的一侧所有的元素(因为我们明确知道它们不可能比当前这个元素大)。

如果我们需要查找的数比它小,我们则可以直接放弃比它大的一侧所有的元素(因为我们明确知道它们不可能比当前这个元素小)。

3.针对剩下的待排查的数来说,我们可以再次重复上面的过程。这样我们就可以迅速的进行查找了。

这样。每次都缩减一半的待查找元素,因此查找所需访问元素的个数就少很多,也快很多。

50beb04506f3

折半查找(binary search)

实现一个折半查找的程序啦。

给定 N个整数和 K个待查找的整数,如果待查找的整数在给定的 NN 个整数中,请输出待查找的整数是数组中第几个元素(从 1 开始计算,第一个元素计 1 而不是 0);如果待查找的整数不在给定的 N个整数中,则输出 0。

样例输入1

3 1

1 4 6

4

样例输出1

2

样例输入2

5 2

1 4 6 7 8

5 1

样例输出2

0 1

样例输入3

6 4

1 2 4 6 7 8

9 1 5 2

样例输出3

0 1 0 2

代码如下:

#include

void print(int a, int b, int c){ // 照顾输出格式,最后一个数字没有空格

if (a==(b-1)){

printf("%d",c);

}

else{

printf("%d ",c);

}

}

int main() {

int n;

int k;

int numbers[1000001];

int m;

int i;

int j;

// 反复读入数字和查找数字的数量

while (scanf("%d%d", &n, &k) != EOF) {

// 读入给定的数字

for (i = 0; i < n; i++) {

scanf("%d", &numbers[i]);

}

for (j = 0; j < k; j++) {

// 读入待查找的数字,

scanf("%d", &m);

// 请在下面完成查找读入数字的功能

int begin = 1;

int end = n;

int mid = (begin+end)/2;

while(end >= begin){

if (m == numbers[mid-1]){

print(j,k,mid);

break;

}

else if ((m > numbers[mid-1]) && (m <= numbers[n-1])){

begin = mid;

mid = (begin+end)/2;

}

else if ((m < numbers[mid-1]) && (m >= numbers[0])){

end = mid;

mid = (begin+end)/2;

}

else {

print(j,k,0);

break;

}

if ((begin ==(end-1))||(begin == end)){ //照顾卡在中间的情况

if (m ==numbers[begin-1]){

print(j,k,begin);

break;

}

if (m == numbers[end-1]){

print(j,k,end);

break;

}

else {

print(j,k,0);

break;

}

}

}

}

}

return 0;

}

递推数组

在计算理工学院有一个长腿君,他在爬楼梯的时候从来都是要么上 22 个台阶,要么上 33 个台阶。由于爬楼梯实在太无聊了,长腿君就开始尝试每天采用不同的方式上楼梯。如果长腿君回家需要爬 NN 阶台阶,你能告诉长腿君,他爬楼梯回家有多少种不同的方式吗?

请注意,长腿君“先爬 33 个台阶后爬 22 个台阶”和“先爬 22 个台阶后爬 33 个台阶”是两种不同的回家方式。

输入格式

测评机会反复运行你的程序。每次程序运行时,你的程序仅需输入一个符合描述的整数 N,表示总共的台阶数(2≤N≤50)。

输出格式

输出为一行,输出一个整数,表示长腿君

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值