小学生都看得懂的C语言入门(4): 数组与函数
// 之前判断素数, 只需要到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): 数组与函数的更多相关文章
- 小学生都看得懂的C语言入门(3): 数组与函数
		
#include <stdio.h> int main() { int x; ; ; scanf("%d",&x){ sum+=x; cnt++; scanf( ...
 - 小学生都看得懂的C语言入门(1): 基础/判别/循环
		
c基础入门, 小学生也可以都看得懂!!!! 安装一个编译器, 这方面我不太懂, 安装了DEV-C++ ,体积不大,30M左右吧, 感觉挺好用,初学者够了. 介绍下DEV 的快键键: 恢复 Ctrl+ ...
 - 小学生都看得懂的C语言入门(5): 指针
		
现在已经学到C语言的后面了, 快学完咯.... (一)取地址运算 先来看一下sizeof 计算所占字节 #include<stdio.h> int main() { int a; a=; ...
 - 小学生都看得懂的C语言入门(6): 字符串
		
1.字符用 char 表示 #include<stdio.h> int main() { char c; char d; c=; d='; if (c==d){ printf(" ...
 - 小学生都看得懂的C语言入门(2): 判别 循环的一些应用实例
		
1.bool 类型 定义bool类型之前需要导入#include <stdbool.h> #include <stdio.h> #include <stdbool.h&g ...
 - JS对象 JavaScript 中的所有事物都是对象,如:字符串、数值、数组、函数等,每个对象带有属性和方法。
		
什么是对象 JavaScript 中的所有事物都是对象,如:字符串.数值.数组.函数等,每个对象带有属性和方法. 对象的属性:反映该对象某些特定的性质的,如:字符串的长度.图像的长宽等: 对象的方法: ...
 - Go语言入门教程(十)之函数
		
Hello 各位小伙伴大家好,我是小栈君,假期一眨眼就过去了.不知道大家玩的是否开心呢? 上次我们讲到了关于Go语言的流程控制,小栈君也希望小伙伴跟着小栈君一步一个脚印的敲一下代码,相互进步.本期我们 ...
 - C语言二维数组作为函数的参数
		
前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数.在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示.我写程序的错误如下程序所示: #include < ...
 - 小学生都能读懂的网络协议之:WebSocket
		
目录 简介 webSocket vs HTTP HTTP upgrade header websocket的优点 webScoket的应用 websocket的握手流程 WebSocket API 总 ...
 
随机推荐
- java包装类型的坑
			
开发中有遇到Long类型比较是否相等,比如Long A和Long B判断是否相等,当时习惯性的直接A==B: 自测的话确实么有问题,但是测试那边测试就有问题,当时郁闷了一下然后换成了A.equals( ...
 - Django REST Framework API Guide 03
			
本节大纲 1.Routers 2.Parsers 3.Renderers Routers Usage from rest_framework import routers router = route ...
 - 安装.src.rpm
			
.src.rpm在坟墓镜像中能找到,例如6.8 os 的rpm包的.src.rpm格式就存放在http://vault.centos.org/6.8/os/Source/ .src.rpm是源码包,是 ...
 - Required String parameter 'images' is not present
			
后台控制层控制为非必填即可: @RequestMapping("/addDo") @SJson @SLog(description = "Car_main") ...
 - android图片绘制
			
1.基本圆角.边框 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android=& ...
 - SpringMVC中请求路径参数使用正则表达式
			
@GetMapping("/user/{id:\\d+}") //使用正则指定Id为数字 public User getInfo(@PathVariable String id){ ...
 - Iterables vs. Iterators vs. Generators
			
Reprinted from: Iterables vs. Iterators vs. Generators Occasionally I've run into situations of conf ...
 - python3编码(encode,decode)
			
python3默认编码为unicode,由str类型进行表示.二进制数据使用byte类型表示. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> bytes d ...
 - 消息队列:JMS之基本概念介绍
			
摘要:The Java Message Service (JMS) API is a messaging standard that allows application components bas ...
 - 线性回归,逻辑回归,神经网络,SVM的总结
			
目录 线性回归,逻辑回归,神经网络,SVM的总结 线性回归,逻辑回归,神经网络,SVM的总结 详细的学习笔记. markdown的公式编辑手册. 回归的含义: 回归就是指根据之前的数据预测一个准确的输 ...