查看完整版本: 請幫忙……判決質數個數
頁: [1]

koless 發表於 2009-5-7 11:57 AM

請幫忙……判決質數個數

題目:輸入兩個整數X和Y,輸出兩者之間的質數個數(包括X和Y)。
Input:兩個整數X和Y,X和Y的大小任意。
Output:輸出一個整數,結果可以是0,也可以是大於0的整數。

我是新手……這個還做不出來……<div></div>

superppp 發表於 2009-5-8 12:28 AM

大概流程是這樣:用cin接收X和Y,然後用兩個for迴圈,
第一個迴圈i從x數到y,第二個迴圈j從1數到x,
如果i除以j餘數等於0,k就加1,
如果k=2,m加1,
最後輸出m,就是答案了

include 發表於 2009-5-8 01:02 AM

#include<iostream.h>

void main()
{
        int x,y,i,j,k,m = 0;
        cin>>x>>y;
        for(j = x;j <= y;j ++)
        {
                i = 0;
                for(k = 1;k <= j;k ++)
                {
                        if(j % k == 0)
                                i ++;
                }
                if(i == 2)
                        m ++;
        }
        cout<<m;
}用2樓的演算法寫成的!!

qwe26865154 發表於 2009-5-9 11:54 AM

三個方法給您參考
#include<stdio.h>
int isPrime(int); //判斷傳入的值是否為質數的函數
void main(){
int num,i;

printf("輸入 =>");
scanf("%d",&num);
if(isPrime(num)) printf("%d是質數\n",num); //呼叫函數並傳入num,若回傳1(true),則num為質數
else printf("%d不是質數\n",num); //否則就不是質數
printf("小於%d的質數有 => ",num);
for(i=2;i<num;i++){ //以迴圈將從2開始小於num的數都丟進去函數檢驗
if(isPrime(i))
printf("[%d]",i); //是質數則輸出
}
printf("\n");
}

int isPrime(int n){
int i;

for(i=2;i<n;i++){ //以迴圈將n各除以從2開始到小於自己的整數
if(n%i==0) //若有能整除他的則回傳0(false),表示他不是一個質數
return 0;
}
return 1; //迴圈跑完仍沒有能整除他的數出現,澤表示他為質數,回傳true
}

#include "stdafx.h"
#include <math.h>
#include <iostream>

using namespace std;

int main(int argc, char* argv[])
{
inti, j, x, m;

printf( "輸入數值:" );
scanf( "%d", &x );

if( x < 2 )
printf( "無解\r\n" );
else if( x == 2 )
printf( "2\r\n" );
else
{
// 排除2以下的質, 所以從3開始判斷
for( m = 3 ; m <= x ; m += 2 )// 排除2的倍數
{
// 任一數的最大因數一定小於該數的平方根
j = (int)( sqrt( m ) );

for( i = 3 ; i <= j ; i += 2 )
if( ( m % i ) == 0 )
break;

if( i >= j )// 沒有任何可以整除的因數,所以為質數
printf( "%d\r\n", m );
}
if( m == x )
printf( "輸入的%d也是質數\r\n" );
else
printf( "輸入的%d不是質數\r\n" );
}
system("PAUSE");
return 0;
}

#include<iostream>
using namespace std;

bool isPrime (int x);

int main ()
{
int i,m;//答案是i,範圍是m。

cout<<"請輸入i:"<<endl;//輸入範圍。
cin>>m;//放入m。

for (i=2;i<=m;i++)//i從2開始,i小於等於m,i每次都+1。
{
if (isPrime(i))//如果i執行"isPrime"函數。
cout <<i<<"是質數" <<endl;//輸出i是質數,換行。
}
return 0;
}


bool isPrime (int x)
{
int i;
for (i=2;i<x;i++)//i從2開始,i小於x,i每次都+1。
{
if (x%i==0)//如果x被i整除。
{
return false;//回傳錯誤。(也就是不回傳值)
}
}
return true;//回傳正確值。(也就是回傳值)
}



...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

ntouwei0307 發表於 2009-5-18 01:57 PM

這是質數相關的程式 妳可以參考這些 寫出你想要的程式碼 加油囉~

#include <iostream>
#include <stdio.h>

using namespace std;
static int count=0;
int main()
{
    static int a=0;
        for(int i=0 ;i <101 ; i++)
        {       
                if(i%2 != 0 || i==2)
                {       
                        if(i%3 != 0 || i==3)
                        {       
                                if(i%5 != 0 || i==5)
                                {       
                                        if(i%7 !=0 || i==7)
                                        {       
                                                printf("質數 = %d" ,i);
                                                a=a+i;
                                        }
                                }
                        }
                }
        }
//        a=a+2+3+5+7;
        printf("\r\nANS = %d\n",a);
        system("pause");
        return 0;
}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

in_dependent_ 發表於 2009-5-22 12:27 AM

參考看看,我的寫法。#include <stdio.h>
#include <stdlib.h>

int main(void){

  int i,num,flag=1;
  int j,sum=0;
  int start,last;
  printf("輸入從哪個數開始和結束數字");
  scanf("%d%d",&start,&last);
  printf("%d~%d的質數有:\n",start,last);
  for(j=start;j<=last;j++){
    num=j;
    flag=1;

    for(i=2;i*i<=num;i++){

      if(num%i==0){
        flag=0;
        break;
      }
    }

    if(flag==1&&num!=1){
      sum=sum+1;
      printf("%2d, ",num);
      printf("第%d個質數\n",sum);
    }
  }
  system("pause");
  return 0;
}
...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

adavis10006 發表於 2009-5-25 09:51 AM

如果要加快速度的話可以把x%y中的y用2~x開根號考慮就好

goodbye_mylove 發表於 2009-5-25 12:03 PM

3# include

[*]                for(k = 1;k <= j;k ++)[*]                {[*]                        if(j % k == 0)   -> 請問.. 這個地方在 k=1 的時候是不是就必成立??[*]                                i ++;[*]                }

include 發表於 2009-5-25 06:03 PM

回八樓 k=1時一定會成立
演算法是二樓提供的
應該是沒有錯

yyyyman 發表於 2009-5-26 09:53 AM

回八樓
就是利用1和自己本身可除<br><br><br><br><br><div></div>

superppp 發表於 2009-5-26 01:46 PM

如果要加快速度的話可以把x%y中的y用2~x開根號考慮就好
adavis10006 發表於 2009-5-25 09:51 AM http://www01.eyny.com/images/common/back.gif

請問一下為什麼要開根號?

yyyyman 發表於 2009-5-26 07:24 PM



請問一下為什麼要開根號?
superppp 發表於 2009-5-26 01:46 PM http://www02.eyny.com/images/common/back.gif因數成對,a*b=X...若a=b又a可被X除 a*a=X  a=根號(X),利用此可加速尋找速度.數學上有沒有特殊的名稱找不到.不過我比較好奇的是質數定理的發現.
頁: [1]