題目內容:
我們認為2是第一個素數,3是第二個素數,5是第三個素數,依次類推。
現在,給定兩個整數n和m,0<n<=m<=200,你的程式要計算第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入格式:
兩個整數,第一個表示n,第二個表示m。
輸出格式:
一個整數,表示第n個素數到第m個素數之間所有的素數的和,包括第n個素數和第m個素數。
輸入樣例:
2 4
輸出樣例:
15
----------------------------------------分割線------------------------------------------------
**以下是我的代碼**
#include<stdio.h>
int main()
{
int N, M, x=2, sum=0;
int i, isPrime, cnt=0;
scanf("%d %d", &N, &M);
if( N>0 && N<=M && M<=200 ){
while( cnt<M ){
isPrime=1;
for( i=2; i<x; i++){
if( x%i==0 ){
isPrime=0;
break;
}
}
if( isPrime==1 ){
cnt++;
if(cnt>=N)
sum=sum+x;
}
x++;
}
}
printf("%d", sum);
return 0;
}
我看網上正確的代碼是用到了sqrt()這個函式,我知道這是求一個非負實數的平方根。我不太明白為什么要用這個函式,還有必須要用這個函式做這個題目嗎?
uj5u.com熱心網友回復:
你的代碼邏輯上沒看出問題,你運行出什么錯了?至于sqrt()這個函式,用不用無所謂,用了就是能改善些效率,減少回圈次數,也就是for( i=2; i<x; i++){ //沒必要回圈到x-1,本來回圈到sqrt(x)就可以了。當然你也可以用x/2代替sqrt(x),因為一般x/2就是最大的除數了,超過x/2,除了x本身,不可能有被x整除的數了。
uj5u.com熱心網友回復:
判斷一個數n是和數,相當于一定有兩個大于1的整數x、y 有:x*y = n。比如 5(回圈中的i)*2 = 10(和數)。其實在i = 2時已經判斷過一次了。
換句話說回圈到sqrt(10)即可。因為當回圈過了這個閾值后,相當于兩個乘數顛倒。之前已經做過判斷了
如果說要效率的話,網上搜200個質數,代碼效率應該不差。運行效率也快,多占點記憶體,但800B應該不大吧
uj5u.com熱心網友回復:
而且在回圈中的時候,其實并不需要判斷所有小于sqrt(n)的整數,只需要判斷小于sqrt(n)的質數即可uj5u.com熱心網友回復:
能告訴我為什么一般x/2是最大的除數嗎?是用到什么推理了嗎?
uj5u.com熱心網友回復:
我覺得你這么說更明確,不過你的答案也幫到我了。因為如果它如果是和數,那么它一定可以表示成兩個數(除了1和它本身)相乘,這兩個數必然有一個小于等于它的平方根。只要找到小于或等于的那個就行了,所以回圈到sqrt(x)就行。
uj5u.com熱心網友回復:
還有就是除了2之外所有的偶數都不是素數,因為他們都有2這個因子。也可以根據這個改進一下程式。uj5u.com熱心網友回復:
用到什么推理?當然就是數學推理啊。你覺得x/3會大于x/2嗎?x/1是x本身,按理是最大的除數,除了它,最大的除數會是什么?你再自己好好想想。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/86025.html
標籤:C語言
上一篇:python基礎題
