iT邦幫忙

0

[新手]c語言課程作業問題

題目是找到2個質數中間尋找時間為3秒左右的質數,最後要將2個質數都印出來。
有人可以幫我看一下有符合題目嗎 下面的是執行出來的ERROR我也不是很懂

#include <stdio.h>
#include <time.h>

int main() {
	enum boolean isprime;
	enum boolean {false,true};
	double z = 0;
	while(z<3){
		clock_t i,j;
		double z;
		i=clock();
		j=clock();
		isprime = true;
		switch(i){
			case 1 :
				isprime =false;
				break;
			case 2 :
				break;
			default :
				for(j=2;j<i;j++){
					if((i%j)==0){
						isprime = false;
						break;
					}
					else;
				}
		z=(double)(j-i);
		printf("Use Time:%f\n",(z/CLOCKS_PER_SEC));
		}
	}
}

https://ithelp.ithome.com.tw/upload/images/20200929/20130984ExmpNDXcdh.jpg

先解決你第一個問題
拿掉
enum boolean isprime;
enum boolean {false,true};
改成
...
#include <stdbool.h>
int main() {
bool isPrime;
...
}
然後
題目是找到2個質數中間尋找時間為3秒左右的質數
請先把你程式邏輯為何這樣寫用註解寫上去
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
微甜的酸
iT邦新手 2 級 ‧ 2020-09-29 20:59:18

不是你嗎?
可以把問題描述得更清楚嗎?

老師只說要我們找前一個質數到後一個質數的時間是3秒

0
海綿寶寶
iT邦大神 1 級 ‧ 2020-09-29 21:22:31

https://ithelp.ithome.com.tw/upload/images/20200929/20001787gNA6xOlcED.png

改寫微甜的酸大大的程式如下
你自己手動去改50000005000100兩個數字(從1,100開始試)
一直改到那個時間有超過 3 秒為止就是答案

#include <stdio.h>
#include <time.h>
int prime(long int n) {
    long int i, flag = 1;
    for(i = 2; i * i <= n; i++) {
        if(!(n % i)) {
            flag = 0;
            break;
        }
    }
    return flag;
}

int main() {
    long int n = 5000000;
    long int previous_n;
    clock_t start_t, end_t;
    double diff_t = 0;
    start_t = clock();
    while ((n < 5000100)&&(diff_t < 3.0)) {
        if (prime(n)>0) {
            end_t = clock();
            diff_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
            // if (diff_t >= 3.0) {
                printf("It cost %.5f seconds between finding prime %d and %d\n", diff_t, previous_n, n);
            // }
            start_t = clock();
            previous_n = n;
        } else {
            // printf("%d is not prime.\n", n);
        }
        n++;
    }
    return 0;
}

我自己用了一點「偷吃步」
得到結果如下
https://ithelp.ithome.com.tw/upload/images/20200929/200017878GYRdbhZCQ.png

另外,點這裡是我這次鐵人賽唯一的一篇文章,喜歡的話左上角點 Like

看更多先前的回應...收起先前的回應...

但是我執行之後出現的都是0.000000秒

感謝海綿大的指正OuO

但是我執行之後出現的都是0.000000秒

原郥上數字越大,時間越長
你要自己去試
我也是試了很久才試出 5000000 那個數字

再提醒一點
老師出這個題目是沒有標準答案的
不同的程式,在不同的電腦,就會有不同的答案

感謝海綿大的指正OuO

不敢
沒有先徵得您的同意就引用您的程式碼
請多包涵
/images/emoticon/emoticon41.gif

後來又想到
題目只有「兩個質數」
沒有「兩個連續質數」
那就改如下

#include <stdio.h>
#include <time.h>
int prime(long int n) {
    long int i, flag = 1;
    // for(i = 2; i * i <= n; i++) {
    for(i = 2; i < n; i++) {
        if(!(n % i)) {
            flag = 0;
            // break;
        }
    }
    return flag;
}

int main() {
    long int n = 1;
    long int previous_n;
    clock_t start_t, end_t;
    double diff_t = 0;
    start_t = clock();
    while ((n < 60000)&&(diff_t < 3.0)) {
        if (prime(n)>0) {
            end_t = clock();
            diff_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
            if (diff_t >= 3.0) {
                printf("It cost %.5f seconds between prime 1 and %d\n", diff_t, n);
            }
            // start_t = clock();
            previous_n = n;
        } else {
            // printf("%d is not prime.\n", n);
        }
        n++;
    }
    return 0;
}

前一個跟後一個是連續的⋯(;´༎ຶД༎ຶ`)

連續的那你就用前一個版本就是了

了解 很感謝你們/images/emoticon/emoticon02.gif

0
buddin
iT邦見習生 ‧ 2023-06-17 18:24:49

基本上是這樣,但我的電腦跑不出答案。搜尋時間相隔3秒的連續質數,它們相差至少3700000以上。(搜尋時間相隔18毫秒以上的連續質數,我的電腦花了4~166秒才找出來...XD)

#include <stdio.h>
#include <time.h>
int prime(long int n){
	for (long int i=2; i*i<=n; i++){
		if (n % i == 0)
			return 0;
	} 
	return 1;
}
int next_prime(long int n, clock_t *end_t){
	n += 1 + n%2;
	while (prime(n)==0){
		n += 2;
	}
	*end_t = clock();
	return n;
}
int main(){
	long int i,a=2,previous_prime,np;
	clock_t start_t,end_t;
	for (i=a-1;i++;){
		if (prime(i)){
			start_t = clock()+3*CLOCKS_PER_SEC;
			previous_prime = i;
			np = next_prime(i,&end_t);
			if (end_t >= start_t){
				printf("%ld %ld",previous_prime,np);
				break;
			}
		}
	}
}

我要發表回答

立即登入回答