廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 12085 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
翁賜維
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++][求助] C++程式碼問題,1~1000的所有質數
我要寫了一個可以印出1~1000所有質數的程式
可是,我發現如果有以下紅色地色的程式碼他就會印出不是質數的數字
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
 int i,j;
..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:台灣台灣寬頻 | Posted:2010-01-12 21:20 |
晴雲秋月
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x10 鮮花 x120
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

質數的定義:指在一個大於1的自然數中,除了1和此整數自身外,無法被其他自然數整除的數.
但是看你寫的,完全看不出來你在驗証是不是質數
我在紙上追蹤了一下,

┌────┬────┬────┬────┬────┬──
│     i     │   1   │   2     │   3   │   4     │ 最大的迴圈
├────┼────┼────┼────┼────┼
│temp1│   3   │   4     │   5     │   6   │ temp1=temp1+i
├────┼────┼────┼────┼────┼
│   j     │  2~3 │ 2~4   │  2~5 │ 2~6 │ 第二層迴圈 j=2~temp1
├────┼────┼────┼────┼────┼
│temp2│ 3%1 │4%2 │ 5%3  │ 6%4 │ 將temp1取餘數temp2=temp1%i
├────┼────┼────┼────┼────┼

若後面判斷式先不看的話,我只看出來

i=1時,j的迴圈跑2次(j=2~3)的 3%1--->不管跑幾次,結果,都是0
i=2時,j的迴圈跑3次(j=2~4)的 4%2--->不管跑幾次,結果,都是0
i=3時,j的迴圈跑4次(j=2~5)的 5%2--->不管跑幾次,結果,都是1
.
.後面略
.
所以前面迴圈架構本身就是錯的,          
根本就不用去看後面的if判斷式了,
因此跟你標的紅字無關,以上針對你寫的程式碼解說,參考看看吧.


[ 此文章被晴雲秋月在2010-01-12 23:49重新編輯 ]


高興也好,難過也好,
用心的過每一天,
~Just feel my soul~
獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2010-01-12 23:22 |
翁賜維
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

抱歉,我打錯了!!
前面的程式碼:
temp2=temp%i應改成temp2=temp1%j才對
這樣才有辦法用那個數去除以大於1小於那個數的所有整數
抱歉!!
麻煩在幫我看一下,謝謝!!


獻花 x0 回到頂端 [2 樓] From:台灣台灣寬頻 | Posted:2010-01-13 08:09 |
leacks 手機
個人文章 個人相簿 個人日記 個人地圖
小有名氣
級別: 小有名氣 該用戶目前不上站
推文 x8 鮮花 x324
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

用暴力法的話
複製程式
       int num[1000];
       int atemp,btemp,ctemp,i;
       cout<<"1,2,";
       num[0]=2;
    btemp=0;
       atemp=2;
    while(atemp<1000)
            {
                ctemp=0;
                for(i=0;i<=btemp;i++)
                   {
                       if((atemp%num[i])==0)
                         {
                             ctemp=1;
                             break;
                         }
                   }
                if(ctemp==0)
                  {
                      cout<<atemp<<",";
             btemp++;
                      num[btemp]=atemp;
                  }
          atemp++;
            }
 system("pause");

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


獻花 x1 回到頂端 [3 樓] From:台灣台灣基礎開發 | Posted:2010-01-14 18:30 |
晴雲秋月
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x10 鮮花 x120
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

下面是引用 翁賜維 於 2010-01-13 08:09 發表的 : 到引言文
抱歉,我打錯了!!
前面的程式碼:
temp2=temp%i應改成temp2=temp1%j才對
這樣才有辦法用那個數去除以大於1小於那個數的所有整數
抱歉!!
麻煩在幫我看一下,謝謝!!

嗯,那意思就是如下了
┌────┬────┬────┬────┬────┬──
│     i     │   1   │   2     │   3   │   4     │ 最大的迴圈
├────┼────┼────┼────┼────┼
│temp1│   3   │   4     │   5     │   6   │ temp1=temp1+i
├────┼────┼────┼────┼────┼
│   j     │ 2~3 │ 2~4   │ 2~5 │ 2~6 │ 第二層迴圈 j=2~temp1
├────┼────┼────┼────┼────┼
│temp2│ 3%1 │4%2 │ 5%3 │ 6%4 │ 將temp1取餘數temp2=temp1%j
├────┼────┼────┼────┼────┼

大致上你要算是否為質數的的方向是OK的,
不過錯在你的判斷式,
你判斷式為
if(整除)
  則跳出迴圈,
else
  印出來.

因為會造成不管對錯,都會列印出來,對的會重覆出現,錯的也會出現

舉個例子,當i=3時,則temp1=5時,在j=2~5的迴圈中
5%2=1 ==>印出來
5%3=2 ==>印出來
5%4=1 ==>印出來
5%5=0 ==>跳出迴圈
因為從2 開始除,每除一次就印一次,所以會印出3個5

若i=7時,則temp1=9時,在j=2~9迴圈中
9%2=1 ==>雖然不為質數,但因為第一個是用去驗証,且又沒有整除,所以會被印出來
9%3=0 ==>跳出迴圈,第二個驗証才整除,不過除以2時,就已印出9了

因此,只要是單數,都會被印出至少一個

所以是整個判斷式有問題,不是紅色字,
給你一個方向,你可以在迴圈內用個變數去記錄,是否整除,待迴圈都除好時,在用此變數去判斷
才不會造成重覆印和印出質數來.

以上參考看看


高興也好,難過也好,
用心的過每一天,
~Just feel my soul~
獻花 x0 回到頂端 [4 樓] From:台灣中華電信 | Posted:2010-01-17 21:14 |
晴雲秋月
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x10 鮮花 x120
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
  int i,j;
  bool prime; //記錄是否為質數的旗標,true:為質數,false:不為質數

  cout << '2'; //先印出2
  for(i=1;i<=998;i++)
  {
      int temp1=2;
      temp1=temp1+i; //由3開始跑
      for(j=2;j<temp1;j++)
      {
        prime=false;   //旗標先設為:false,不為質數
        int temp2;
        temp2=temp1%j; //由2開始除
        if(temp2 == 0) //餘數為0則跳出
          break;
        else
          prime=true; //餘數不為0時
      }
    if(prime)   //判斷整個除完,是不是餘數都不為0,則為質數
        cout << temp1; //則印出
    }
    system("pause");
    return 0;
}
幫你加了點東西,因為我沒有灌程式,所以無法確定跑不跑的起來

此文章被評分,最近評分記錄
財富:50 (by 三仙) | 理由: ^^ 因為您的參與,讓程式設計更容易!!


高興也好,難過也好,
用心的過每一天,
~Just feel my soul~
獻花 x1 回到頂端 [5 樓] From:台灣中華電信 | Posted:2010-01-17 21:39 |
翁賜維
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

感謝各位大大的幫忙^^
我已經解決了表情


獻花 x0 回到頂端 [6 樓] From:台灣中華電信 | Posted:2010-01-19 23:04 |
su5gsm
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 路人甲 該用戶目前不上站
推文 x0 鮮花 x5
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

#include <stdio.h>
#include <stdlib.h>
/* all prime < a */
int main(void)
{
  int j=3,i=2,prime=1,a;
  printf("input a= ");
  scanf("%d",&a);
  printf("2\n");
  for(j=3;j<=a;j++)
  {
    prime=1,i=2;   //init data      
    for(i=2;i<j;i++) { if (j%i==0) prime=0; }
   
    if (prime==1) printf("%d\n",j);
  }
 
  system("pause");
  return 0;
}


獻花 x1 回到頂端 [7 樓] From:局域網對方和您在同一內部網 | Posted:2010-10-28 15:56 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.075206 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言