最简单的搜索
在一组给定的数据中,如何找出某个数据是否存在?
int search(int key;int a[],int lenth);
int main(void)
{
int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};
//int a[]={2} 后面的默认输入0
{
int i;
for(i=0;i<13;i++){
printf("%d\t",a[i]);
}
printf("\n");
}
int x;
int loc;
printf("请输入一个数字:");
scanf("%d",&x);
loc=search(x,a,sizeof(a)/sizeof(a[0])};
if(loc!=-1){
printf("%d在第%d个位置上\n",x,loc);
}else{
printf("%d不存在\n",x);
}
return 0;
}
int search(int key;int a[],int lenth);
数组的集成初始化
int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};
直接用大括号给出数组的所有元素的初始值
不需要给出数组的大小,编译器替你数数
={0} 相当于初始化所有都等于零
集成初始化时的定位(c99 only)
int a[10]={
[0]=2,[2]=3,6,
};
用[n]在初始化中给出定位
没有定位的数据接在前面的位置后面
其他位置的值补零,={0} 相当于初始化所有都等于零
也可以不给出数组大小,让编译器算
特别适合初始数组稀疏的数组
数组的大小
sizeof 给出整个数组所占的内容的大小,单位是字节
sizeof(a)/sizeof(a[0])
sizeof(a[0])给出数组中单个元素的大小,于是相除就得到了数组单元个数
这样的代码便于修改
int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32,};
后面留 , 便于后来人修改
数组的赋值
int a[]={2,3,4};
int b[]=a;//错误写法
数组变量本身不能被赋值
要把一个数组的所有元素交给另一个元素,必须采用遍历
for(i=0;i<length;i++){
b[i]=a[i];
}
遍历数组
通常使用for循环,让循环变量i从0到<数组长度,这样循环体内最大的i正好是数组最大的有效下标
常见错误:
循环结束条件是<=数组长度或者
离开循环后,继续用i的值(正好是无效下标)来做数组元素的下标!
int main(void)
{
int a[]={2,4,6,7,1,3,5,9,11,13,23,24,32};
int x;
int loc;
printf("请输入一个数字:");
scanf("%d",&x);
loc=search(x,a,sizeof(a)/sizeof(a[0]));
if(loc!=-1){
printf("%d在第%d个位置上\n",x,loc);
}else{
printf("%d不存在\n",x);
}
return 0;
}
/**
找出key在数组中的位置
key要寻找的数字
a要寻找的数组
length数组a的长度
如果找到,返回其在a中的值;如果找不到贼返回-1
**/
int search(int key,int a[],int length)
{
int ret=1;
for(i=0;i<length;i++){
if(a[i]==key){
ret=1;
break;
}
}
return ret;
}
数组作为函数参数时,往往必须再用另一个参数来传入数组的大小
不能在 [ ] 中给出数组的大小
不能再利用sizeof来计算数组的元素个数!(指针时候再讲)
判断素数
int isPrime(int x);
int main(void)
{
int x;
scanf("%d",&x);
if(isPrime(x)){
printf("%d是素数\n",x);
}else{
printf("\n不是素数",x);
}
return 0;
}
//从2到x-1测试是否可以整除
int isPrime(int x);
{
int ret=1;
int i;
if(x==1) ret=0;
for(i=2;i<x;i++){
if(x%i==0){
ret=0;
break;
}
}
return ret;
}
//去掉偶数后,从3到x-1,每次加2
int isPrime(int x);
{
int ret=1;
int i;
if(x==1||
(x%2==0&&x!=2))
ret=0;
for(i=3;i<x;i+=2){
if(x%i==0){
ret=0;
break;
}
}
return ret;
}
//无须到x-1,到sqrt(x) 平方根 就够了
int isPrime(int x);
{
int ret=1;
int i;
if(x==1||
(x%2==0&&x!=2))
ret=0;
for(i=3;i<sqrt(x);i+=2){
if(x%i==0){
ret=0;
break;
}
}
return ret;
}
Unix输入man sqrt,win百度
了解函数功能最好方式
//判断是否能被已知的且<x的素数整除
int main(void)
{
const int number=100;
int prime[number]={2};
int cont=1;
int i=3;
while(count<number){
if(isPrime(i,prime,count)){
prime[count++]=i;
}
//加大括号调试代码,里面的变量不会影响外面
{
printf("i=d\t cnt=%d\t,i,count);
int i;
for(i=0;i<number;i++){
printf("%d",prime[i]);
}
printf("\n");
}
i++;
}
for(i=0;i<number;i++){
printf("%d",prime[i]);
if((i+1)%5) printf("\t");
else printf("\n");
}
return 0;
}
int isPrime(int x,int kownPrimes[],int numberofKnounPrimes);
{
int ret=1;
int i;
for(i=0;i<numberofKnounPrimes;i++){
if(x% kownPrimes[i]==0){
ret=0;
break;
}
}
return ret;
}
另一种思路
#include<stdio.h>
int main()
{
const int maxNumber=25;
int isPrime[maxNumber];
int i;
int x;
for(i=0;i<maxNumber;i++){
isPrime[i*x]=0;
}
printf("\n");
return 0;
}
}