日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

数组(2)数组运算及典例(求解素数的方法)

發布時間:2023/11/29 windows 47 coder
生活随笔 收集整理的這篇文章主要介紹了 数组(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, };

特點:
  1. 用[n]在初始化數據中給出定位;
  2. 沒有定位的數據接在前一個單元之后;
  3. 其余位置補0;
  4. 也可以不給出數組大小讓編譯器算;

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.數組作為函數參數時,必須再使用另外一個參數來傳入數組的大小

注意:

  1. 當數組作為函數參數時,不能在[]中給出數組的大小;
  2. 同時也不能再利用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[i
x]=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)数组运算及典例(求解素数的方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。