2.3 计算e的值和求素数 e是自然对数的底,它和π一样是数学中最常用的无理数常量。其近似值的计算公式为: e=1+1/1!+1/2!+1/3!+...+1/(n-1)!+r 当n充分大时,这个公式可以计算任意精度e的近似值。为了保证误差r<ε,只需1/(n-1)! ( > r) <ε 程序代码如下: // program 2_4.cpp #include<iostream.h> void main() { const double eps=0.1e-10; int n=1; float e=1.0,r=1.0; do // 开始do循环。循环条件由后面的while中的表达式值确定。 { e+=r; n++; r/=n; } while(r>eps); cout<<"The approximate Value of natural logarithm base is: "; cout<<e<<endl; } 程序运行结果如下: The approximate Value of natural logarithm base is: 2.71828
说明: 上面这个程序中使用了do循环,它是循环控制中的一种。循环控制条件放在后面的while表达式中。 ----------------------------------------- 下面的程序用来求出1000以内的全部素数。 // program 2_5.cpp #include<iostream.h> void main() { const int m=1000; int i,j,isprime; for(i=2;i<=m;i++) // 这里用到了for循环控制语句。for循环语句有三个表达式 { // 第一个表达式赋给变量初值,第二个表达式为循环控制条件, // 第三个表达式为循环变量改变其值 isprime=1; for(j=i-1;j>1;j--) if(i%j==0)isprime=0; if(isprime)cout<<i<<','; if(i%30==0)cout<<endl; } }
说明: 1)当m值比较大时,这个程序计算量是比较大的,事实上这是用来求出小于m的所有素数的最简单也是最笨的算法。 一种办法是作下面的改进: 把 for(j=i-1;j>1;j--)改为: int i1=int(sqrt(i)); for(j=i1;j>1;j--) 为了确定整数i是不是素数,不需要用2,3,。。。,i-1来除它,只需用2,3,。。。,sqrt(i)试除就可以了。 这里sqrt(i)是标准函数,功能是计算平方根,而int()则是把浮点值围 化为整型值。 另一种算法是埃拉脱散(Eratosthenes)筛法,将在以后介绍。
--------------------------------------------------------------------------------------
3.1 统计学生成绩 已知n个学生的注册号和成绩,计算他们的平均成绩,并列出成绩最好的前t名学生的注册号和分数。 程序代码如下: // program 3_1.cpp #include<iostream.h> void main() { const int n=3; const int t=n; int index[n]; // 存放注册号 float score[n]; // 存放成绩 for(int i=0;i<n;i++) cin>>index[i]>>score[i]; // 从键盘输入数据 float sum=0; for(i=0;i<n;i++) sum+=score[i]; // 计算分数总和 cout.precision(2); // 设置输出精度 cout<<endl<<"Average score:"<<sum/n; cout.width(28); // 输出精度 cout<<endl<<" register number score"; for(i=0;i<t;i++) // 选取前t名分数最高的学生,输出其注册号和成绩 { float s=score[i]; int j1=i; for(int j=i+1;j<n;j++) if(s<score[j]) { s=score[j]; j1=j; } if(j1>i) { score[j1]=score[i]; score[i]=s; j=index[j1]; index[j1]=index[i]; index[i]=j; } cout.width(4); // 输出序号,注册号和分数 cout<<endl<<i+1; cout.width(11); // 设置宽度 cout<<index[i]; cout.width(16); cout.precision(2); // 设置输出精度 cout<<score[i]; } cout<<endl; } 程序运行结果如下:
说明 : cout.precision(2)是一个函数调用语句,函数名是precision。cout说明此函数是一个标准类的一个标准对象cout的函数。所“标准”,即它们所涉及的流(stream)类和对象cout都是由系统已经义好了的。其说明可以在头文件iostream.h中找到。函数precision要求一个int型参数,该参数指出在后面输出的浮点数的精度取到小数点后的多少位。 cout.width()是另一个函数的用法。width决定了其后数据输出的宽度。
-----------------------------------------------------------------------------------
3.2 输出三角函数表 输出人0~90度之间每隔15度的正弦、余弦、正切函数值。 程序代码如下: // program 3_2.cpp #include<iostream.h> #include<math.h> void main() { const float pai=3.1416f; const int interval=15; cout.width(10); cout<<"Angle x"; cout.width(10); cout<<"sin(x)"; cout.width(10); cout<<"cos(x)"; cout.width(10); cout<<"tan(x)"; float arc; cout.precision(4); for(int doa=0;doa<=90;doa+=interval) { arc=pai*doa/180; cout<<endl; cout.width(10); cout<<doa; cout.width(10); cout<<sin(arc); cout.width(10); cout<<cos(arc); cout.width(10); if(doa==90) cout<<"-"; else cout<<tan(arc); } cout<<endl; }
程序运行结果如下:
说明: 1)本程序中使用了系统提供的标准库函数sin(),cos(),tan(),它们都在头文件math.h中说明。因此在3行包含了此文件。 2)由于当doa=90时,其正切函数趋于无穷大,故对它有特殊的处理,否则如按正弦、余弦一样输出,当doa变到90时,运行将可能溢出或打印一个超界的大数。
--------------------------------------------------------------------
3.3 Eratosthenes 筛法求素数 在2_3节给出了一个求在一个范围内的全部素数的程序。下面给出的程序其算法比原来的好。 program3_5是对2~1000的所有素数进行检测,用小于该数的数试验,如果都不能除尽,就找到了一个素数。本节的程序也是用来求1000以内的所有素数,但其思想简单而巧妙。它是把2~1000所有的整数放到一起,首先把2保留,把2的所有素数从中去掉,再保留3,同时删去所有3的倍数,下一个数是5,7...。好象是一把筛子,把不需要的数逐步筛去,留下的正是所求的数。 程序代码如下: // program 3_4.cpp #include<iostream.h> #include<iomanip.h> void main() { const int n=1000; int i=1,j,count=0,sieve[n+1]; for(j=1;j<n;j++)sieve[j]=j; // 把1~n存入sieve[n] while(i<n+1) // 从while循环开始完成全部素数的产生和输出。 { while(sieve[i]==1) i++; // 跳过值为1的分量,表示下一个分量必为一素数 cout<<setw(4)<<sieve[i]; // setw(4)设置以宽度为4的格式输出数据。setw(4) // 等价于cout.width(4) count++; if(count%15==0)cout<<endl; for(j=i;j<n+1;j+=i) sieve[j]=1; } } 程序运行结果如下:
 
2/2 首页 上一页 1 2 |