// 之前判断素数, 只需要到sqrt(x)即可,
//更加简单的, 判断能够比已知的小于x的素数整除, 运行更快

#include <stdio.h>
// 之前判断素数, 只需要到sqrt(x)即可,
//更加简单的, 判断能够比已知的小于x的素数整除, int isprime(int x,int knownprimes[],int n)
{
int ret=;
int i;
for (i=;i<n;i++){
if (x%knownprimes[i]==){
ret=;
break; //不是素数
}
}
return ret;
} int main(void)
{
const int num=;// 想要输出几个素数
int prime[num]={}; //存放素数
int i=;
int cnt=; // 增加一个表头, 表示列数
{
printf("\t\t");
for (int i=;i<num;i++){
printf("%d\t",i);
}
printf("\n");
}
// 以上表头 while(cnt<num){
if (isprime(i,prime,cnt)){
prime[cnt++]=i; // 这个表达式将 i写入到cnt位置, 又使其+1
}
// 增加调试 用一对{}括起来
{
printf("i=%d\tcnt=%d\t",i, cnt);
for(int i=;i<num;i++) {
printf("%d\t",prime[i]);
}
printf("\n");
}
// 调试 i++;// 测试下一个i
}
for (i=;i<num;i++){
printf("%d",prime[i]);
if((i+)%) printf("\t");
else printf("\n");
}
return ;
}

那么如何构造素数表?.. (划线法) .. 想要构造n以内的素数表,

1.令x为2,

2.将小于n的2x 3x 4x...的数标记为非素数,

3.令x 为下一个没有被标记为非素数的数, 重复2; 直到所有的数都尝试完毕.

算法:

1.开辟prime[n], 初始化全为1, prime[x]=1表示x是素数,

2.令x=2;

3. 如果x是素数, 对于(i=2;i*x<n;i++) 令prime[i*x]=0;

4.x++, 如果x<n 重复3, 否则结束

程序如下

#include<stdio.h>
int main()
{
const int num=;// 找30 以内的素数 , 则建立一个长度是30的数组isprime[30]
int x;
int isprime[num];
int i;
for(i=;i<num;i++){
isprime[i]=;
} // 初始化prime 数组, 设置为1 for (x=;x<num;x++){
if (isprime[x]){
for (i=;i*x<num;i++)
isprime[i*x]=;
} // x是素数则 它的倍数都不是素数 标记为0
} for (i=;i<num;i++){ // 从i=2位置开始进行输出
if (isprime[i]==){
printf("%d\t",i);
} } //输出素数
printf("\n");
return ;
}

(一) 搜索实例, (美元不同币值称呼不同)

#include<stdio.h>
// penny 1; nickel 5; dime 10; quarter 25; half-dollar 50
int a[]={,,,,};
char *name[]={"penny","nickel","dime","quarter","half-dollar"};// 这里的* 必须要有, 否则出错! int search(int key, int a[],int len )
{
int ret=-;
for(int i=;i<len;i++){
if (key==a[i]){
ret=i;
break;
}
}
return ret;
} int main()
{
int k=;
int r=search(k,a,sizeof(a)/sizeof(a[]));
if (r>-){
printf("%s\n",name[r]); // 输出k表示的美元货币名字
} return ;
}

结果是dime.

但是这样缺点在于需要用到两个数组, 如何做到只需要一个数组?  ...用struct

#include<stdio.h>struct{
int a;
char *name; // * 必须要有, 否则出错!
} coins[]={
{,"penny"},
{,"nickel"},
{,"dime"},
{,"quarter"},
{,"half-dollar"}
}; int main()
{
int k=;
for (int i=;i<sizeof(coins)/sizeof(coins[]);i++){
if (k==coins[i].a){
printf("%s\n",coins[i].name);
break;
}
} return ;
}

之前这种线性搜索很慢, 如果要搜索的值为数组的最后一个, 则需要全部遍历, 不好, 可以用二分法进行搜索, 确定left ,right ,mid , 缩小范围

但二分法的前提是数据已经从小到大排好了, 先假设数组中的元素已经按照升序排好了

 
#include<stdio.h>
int search(int key,int a[],int len)
{
int left=;
int right=len-;// 最大下标是长度-1
int ret=-; // 判别是否找到,记录位置
while(left<=right)
{
int mid=(left+right)/;
if(a[mid]==key){
ret=mid;
break;
}else if(a[mid]>key){
right=mid-;
}else{
left=mid+;
}
}
return ret;
}
int main()
{
int a[]={,,,,,};
int k=;
int loc=search(k,a,sizeof(a)/sizeof(a[]));
printf("%d",loc);
return ;
}

上述要找k=3 所在的位置, 开始left=0,right=5, mid=2, 之后 left=0, right=1, mid=0; 之后left=1, right=1, 终止循环, 但是没有输出啊, 函数中ret=-1没有改变过!!

这是怎么回事?

接下来考虑如何排序问题,,,

我们用选择法 进行排序

#include<stdio.h>
// 排序
// 思路, 找到数组中找出最大的值的位置;
// 交换位置, 将最大值与数组的最后一个位置的值交换;
// 剩下的n-1长度的继续找最大的,
int max(int a[],int len)
{
int maxid=;
for(int i=;i<len;i++){
if (a[i]>a[maxid]){
maxid=i;
}
}
return maxid;
} int main()
{
int a[]={,,,,,,,,};
int len=sizeof(a)/sizeof(a[]);
for (int i=len-;i>;i--)
{
int maxid=max(a,i+);// 找到最大的
// swap a[maxid] and a[len-1]
int t=a[maxid];
a[maxid]=a[i];
a[i]=t;
}
// 输出排序后的结果
for(int i=;i<len;i++){
printf("%d ",a[i]);
}
return ;
}

小学生都看得懂的C语言入门(4): 数组与函数的更多相关文章

  1. 小学生都看得懂的C语言入门(3): 数组与函数

    #include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...

  2. 小学生都看得懂的C语言入门(1): 基础/判别/循环

    c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++  ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...

  3. 小学生都看得懂的C语言入门(5): 指针

    现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...

  4. 小学生都看得懂的C语言入门(6): 字符串

    1.字符用 char 表示 #include<stdio.h> int main() { char c; char d; c=; d='; if (c==d){ printf(" ...

  5. 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例

    1.bool 类型 定义bool类型之前需要导入#include <stdbool.h> #include <stdio.h> #include <stdbool.h&g ...

  6. JS对象 JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。

    什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法: ...

  7. Go语言入门教程(十)之函数

    Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...

  8. C语言二维数组作为函数的参数

    前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...

  9. 小学生都能读懂的网络协议之:WebSocket

    目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...

随机推荐

  1. 「LibreOJ Round #6」花火

    转化思维的好题! 链接:here 大致题意: 有$ n$个数字,你每次可以交换相邻两个,还有一次交换任意两个元素的机会,求最少的交换次数使得这些数字升序排序(原数列两两不同) $ solotion:$ ...

  2. 安装.src.rpm

    .src.rpm在坟墓镜像中能找到,例如6.8 os 的rpm包的.src.rpm格式就存放在http://vault.centos.org/6.8/os/Source/ .src.rpm是源码包,是 ...

  3. Android逆向基础----Android Dalvik虚拟机

    Android Dalvik虚拟机的特点: l  体积小,占用内存空间小. l  专有DEX可执行文件. l  常量池采用32位索引值,寻址类方法名,字段名,常量更快. l  基于寄存器架构,并拥有一 ...

  4. HTML - HTML基础篇

    一.什么是html ? 超文本标记语言.HTML 是标记语言 历史版本: Html 4.01 1999年12月24日,w3c推荐标准 (老网站) 如今 是 html 5 版本. 1.Html 标签拥有 ...

  5. linux(ubuntu) python 版本切换

    参考链接:https://blog.csdn.net/thankyou0/article/details/79610854

  6. springboot整合dubbo\zookeeper做注册中心

    springboot整合dubbo发布服务,zookeeper做注册中心.前期的安装zookeeper以及启动zookeeper集群就不说了. dubbo-admin-2.5.4.war:dubbo服 ...

  7. Linux系统安全学习笔记(1)-- 文件系统类型

    今天看了一个关于Linux系统安全的视频教程,这个教程有很多的知识点,我会分几篇博文将我的笔记分享出来. 首先是关于Linux文件系统类型的一些知识,Linux有四种常见的文件系统类型(网上大多数是3 ...

  8. Java HashMap工作原理及实现[转]

    原文:http://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE ...

  9. Elasticsearch 5.4.3实战--Java API调用:搜索

    ES有多种查询方式,我自己的业务是需要对多个字段进行查询,具体实现类代码如下. package com.cs99lzzs.elasticsearch.service.imp; import java. ...

  10. linux CPU动态调频【转】

    转自:https://www.xuebuyuan.com/2185926.html 针对sep4020的linux低功耗研究也有一段时间了,基本把低功耗的实现方式想清楚了(主要分成机制和策略),这段时 ...