数组(2)数组运算及典例(求解素数的方法)
<1>數組運算
1)數組的集成初始化
-
1.形式示例
1 - int a[]={1,2,3...};
2 - int a[13]={2};————第一個單元內中的a0=2,剩下的單元都默認賦為0;
-
2.集成初始化時的定位——僅適用于C99
舉例:
int a[10]={ [0]=2,[2]=3,6, };
特點:
- 用[n]在初始化數據中給出定位;
- 沒有定位的數據接在前一個單元之后;
- 其余位置補0;
- 也可以不給出數組大小讓編譯器算;
2)數組的大小
————sizeof給出整個數組所占據的內容的大小,單位是字節
-
用sizeof數組除以sizeof數組的第一個單元,就得到數組的元素個數
——sizeof(a)/sizeof (a[0])
- 這樣的代碼,即使數組中的初始數據被修改,也不需要
修改遍歷代碼
3)數組的賦值
-
示例:
int a[]={1,2,3,4...};
int b[]=a;
-
判斷:
————判斷這串代碼是否可以實現將a的數組賦給b的數組
-
結果及原因
1.結果:數組不能實現將一個數組變量賦給另一個數組變量;
2.原因:要實現將一個數組的所有元素交給另一個數組,必須通過遍歷;
- 示例:
for(i=0;i<length;i++){
b[i]=a[i];
}
4)補充:遍歷數組
-
1.一般形式
通常使用for循環,讓循環變量i從0到小于數組的長度,這樣循環體內最大的i正好是數組最大的有效下標 -
2.常見錯誤:
1-循環結束條件為<=數組長度;
2-離開循環后,繼續用i的值來做數組元素的下標;————正好是數組無效的下標 -
3.數組作為函數參數時,必須再使用另外一個參數來傳入數組的大小
注意:
- 當數組作為函數參數時,不能在[]中給出數組的大小;
- 同時也不能再利用sizeof來計算數組的元素個數;
<2>數組典例:素數
-
求解素數的幾種方法
(1)調用函數
int isprime(int x);
int main(void){
int x;
scanf("%d",&x);
if(isprime(x)){
printf("%d是素數\n",x);
}else{
printf("%d不是素數\n",x);
}
}return 0;
(2)從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;
}
-
對于n要循環n-1遍;
-
當n足夠大時,就是n遍;
(3)去掉偶數后,從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;
}
-
當n很大時循環次數為n/2次
(4)對(3)進行進一步修改,無需達到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;
}
-
只需循環sqrt(x)次
(5)構建素數表
int main (void){
const int number=100;//計算前一百位素數
int prime [number]={2};** //初始化為2**
int count=1;//已經包含了一個元素2;
int i=3;
while(count<number){
if (isprime(i,prime,count)){
prime[count++]=i;
//對cnt變量進行理解:
-
cnt變量的值為1,1對應數組下標1所在的位置,所以prime[cnt++]=i我們是將i的值當第一次i=3寫到cnt對應的位置上去;這之后在進行++操作,這時cnt便等于2,也就意味著cnt指向了數組中下標為2的位置(即分為兩個操作:1:將cnt的值賦到對應位置;2:將cnt指向下一個位置)
}
i++;
}
for(i=0;i<number;i++){
printf("%d",prime[i]);
if((i+1)%5) printf("\t");
else printf("\n");
}
return 0;
}
(6)進一步改造素數表
-
規則(構造n以內的素數表)
1. 令x=2;
2. 將2x,3x,4x...直至ax<n的數標記為非素數;
3. 令x成為下一個沒有被標記的非素數的數,重復2的操作,直到所有數被嘗試完畢;
-
我們舉例對方法進行理解
1.數組:2,3,4,5,6,7,8,9,10,11,12,13
2.推理過程:
第一項為2,2的倍數有4,6,8,10,12,將這些數標記為非素數,此時剩下的沒有被標記的非素數為3,5,7,9,11,13;
接著以3為x,3的倍數6,9,12被標記為非素數;此時剩下的沒有被標記的非素數還有5,7,11,13;
以此類推……
(7)再次改造,運用偽代碼
-
目的:構造n以內的素數表
-
思路:
1. 開辟prime[n],初始化其所有元素為1,prime[x]為1表示x是素數;
2. 令x=2;
3. 如果x是素數,則對于(i=2;xi<n;i++),令prime[ix]=0;
4. 令x++,如果x<n,重復3,否則結束
-
代碼
#include <stdio.h>
int main(){
const int maxnumber=25;
int isprime[maxnumber];
int i;
int x;
for(i=0;i<,maxnumber;i++){
isprime[i]=1;//————1.初始化所有元素為1————
}
for(x=2;x<maxnumber;x++){
if(isprime[x]){
for(i=2;ix<maxnumber;i++){
isprime[ix]=0;//————2.將所有該數的倍數標記為0,也就是標記為非素數————
//————3.同時再對下一個素數進行同樣的操作,對小于maxnumber的數進行遍歷————
}
}
}
for(i=2;i<maxnumber;i++){
if(isprime[i]){
printf("%d\t",i);//————4.將所有是素數的數,isprime仍保留為1的進行輸出————
}
}
printf("\n");
return 0;
}
總結
以上是生活随笔為你收集整理的数组(2)数组运算及典例(求解素数的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦见狗追我跑是什么意思
- 下一篇: java信息管理系统总结_java实现科