又一個星期過去了,我的c++學習碰到了釘子,一個很簡單的功能實現,我卻要花一個下午都搞不定.處處都有問題.我感覺那個編譯器好象和我有仇,只要是我的代碼,不改那麼十遍八遍別想運行.在論壇上別人一眼就看出我的錯誤,而我自己卻找不到.靜下心想想,自己根本沒有消化以前看過的知識點,循環,指針,自認為掌握了,可實際真的是一知半解,我算看明白了,這樣繼續看書,思路會越來越亂,所以我這周重點在鞏固對控制語句的應用,這關過不了,就別想走下去,更別想寫出漂亮的代碼.另外,數學知識的欠缺也暴露出來.總的來說,基礎的東西雖然簡單,但絕不能因為簡單就不看,所以我的c++ 又倒退50頁書,重新來第2遍,另外又去書店買了本國產c++ 教程,雖然不如國外那些書權威,不過還是不錯,重點是通過程序講知識點,和<think in c++>結合起來看,學這門語言,我覺得問題還是要靠實踐去發現,和學數學一樣,不做習題,根本別想學好,這些就是我這周的體會,下面貼一段我這周的問題代碼,主要是練習控制語句,最後討論出兩種主要思路實現.
1.要求輸入一個整數做上界,然後在其范圍內列出所有素數(只能被1和本身整除的數),用兩個for循環完成.
#include <iOStream>
using namespace std;
int s,i,n;
void main(){
cout << "please tell me your end number" << endl;
cin >> s;
for(n=1; n<s; n++) /在界限范圍內自加數
for(i=1; n%i!=0;i++) /檢驗是否被其它數整除
if(i+1==n) /如果加一後就已是n本身,說明n是質數
cout << n <<endl;
上面是第一次的代碼,現在看錯誤滿篇,但思路是對的,各位可以試著修改(-_-!自己的程序成改錯題了)
#include <iOStream>
using namespace std;
int s,i,n;
void main(){
cout << "please tell me your end number" << endl;
cin >> s;
for(n=2; n<s; n++) //在界限范圍內自加數
{
for(i=2;n%i!=0;i++);
if(i==n) //如果加一後就已是n本身,說明n是質數
cout << n <<endl;
}
}
上面這段是修正過正確的.
上面兩段主要是通過定義來判斷的,在c++中,for 語句大部分時候起到一個計數的作用,而我把其中一個直接用來判斷,雖然是對的,但看起來則不是很清晰.
下面兩段是通過素數的推倒判斷實現: 判斷一個數n是不是素數,
只要判斷是否存在 <= sqrt(n)的素數是n的約數
#include <iOStream>
#include <conio.h>
#include <math.h>
void main()
{
int s;
std::cout << "please tell me your end number" << std::endl;
std::cin >> s;
if(s<2)
{
std::cout<<"Nothing";
return;
}
std::cout<<"2";
for(int n=3; n<=s; ++n)
{
int p=float(sqrt((float)n));
bool is=true;
for(int i=2; i<=p;++i)
{
if(n%i==0)
{
is=false;
break;
}
}
if(is)
{
std::cout<<'\t'<< n;
}
}
getch();
}
程序中用了bool完成了判斷,而且結構清晰
底下是個篩選法求解
時間復雜度比直接求底
#define N 1111 //輸出小於2*N的全部素數
main()
{
int i,m,k;
int a[N]={0};
for(i=1;i<N;i++)
{
if(a[i]==1) continue;
for(k=1;k<N;k++)
{
m=(2*k+1)*i+k;
if(m>=N) break;
a[m]=1;
}
}
printf(" 2");
for(i=1,m=1;i<N;i++)
if(a[i]==0)
{
printf("%6d ",2*i+1);
if(m++%10==0) printf("\n");
}
}