最新_实验三_参考答案详解.doc_第1页
最新_实验三_参考答案详解.doc_第2页
最新_实验三_参考答案详解.doc_第3页
最新_实验三_参考答案详解.doc_第4页
最新_实验三_参考答案详解.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Outstanding C+ 教育*实验手册_实验三参考答案*用心教育每一天!实验三1、 编写程序,判断某一年是否是闰年。概念:闰年的条件是:(1)能被4整除,但不能被100整除的年份都是闰年,如1996年、2004年是闰年;(2)能被100整除,又能被400整除的年份是闰年,如1600年、2000年是闰年。不符合这两个条件的年份不是闰年。“判断20002500年中的每一年是否是闰年,将结果输出”的算法可表示如下:设y为被检测的年份。可采取以下步骤:S1:2000 yS2:若y不能被4整除,则输出y“不是闰年”。然后转到S6S3:若y能被4整除,不能被100整除,则输出y“是闰年”。然后转到S6S4:若y能被100整除,又能被400整除,则输出y“是闰年”。然后转到S6S5:输出y“不是闰年”S6:y+1 yS7:当y=2500是,转S2继续执行,否则算法停止。在这个算法中,采取了多次判断。先判断y能否被整除,如不能,则y必然不是闰年。如y能被4整除,并不能马上决定他是否是闰年,还要看它能否被100整除。如不能被100整除,则肯定是闰年(例如1996)。如能被100整除,还不能判断它是否是闰年,好药被400整除,如能被400整除,则它是闰年;否则不是闰年。最简单最笨的方法来判断某一年是不是闰年:#include using namespace std;void main( )int year,leap;coutPlease enter a year:year;if(year%4 = 0)if(year%100 = =0)if(year%400 = =0)leap=1;else leap=0;else leap=1;else leap=0;if(leap)coutyear is ;else coutyear is not ;cout a leap yearn;简便方法解决“判断20002500年中的每一年是否是闰年,将结果输出”:#includeusing namespace std;int main()for(int year=2000;year=2500;year+)if(year%4=0)&(year%100!=0)|(year%400=0) coutyear是闰年 ; else coutyear不是闰年 ;return 0;判断某一年是不是闰年:#includeusing namespace std;bool IsLeapYear(int year);int main()int year;cinyear;if(IsLeapYear(year)coutyear是闰年 ;elsecoutyear不是闰年 ;return 0;bool IsLeapYear(int year)if(year%4=0)&(year%100!=0)|(year%400=0) return true;else return false;2、请编写一程序,将所有“水仙花数”打印出来,并打印出其总数。“水仙花数”是一个其各位数的立方和等于该整数的三位数。(答案是:153 ,370 ,371 ,407)#include using namespace std;void PrintfNum();void main()cout水仙花数endl;PrintfNum();void PrintfNum()int gw,sw,bw;int number;for (number=100;number1000;number+)gw=number%10;sw=number%100/10;bw=number/100;/bw=number%1000/100;if(number=gw*gw*gw+sw*sw*sw+bw*bw*bw)coutnumberendl;另一种方法:#include using namespace std; bool num(int x) ;void main() for(int i=100;i 999;i+) if(num(i) couti ; bool num(int x) int i=x%10; int j=(x/10)%10; int k=(x/100)%10; if(x=i*i*i+j*j*j+k*k*k) return true; else return false; 3、若有如下公式: + + +。+ 试根据上述公式编程计算 的近似值(精确到10-6)。#include #include using namespace std;void main()float s=1.0;for(int i=2;(1.0/(i*i)=1.0e-6;i+) / 是float的精度不是=s=s+1.0/(i*i);float pi=sqrt(6.0*s);coutiendl;/显示累加到的最大的n值coutpi=piendl; /精确度越高,值越接近。试精确到e-8或更高4、求素数:概念:质数,又称素数,是只能被1或者自己整除的自然数。 比1大但不是素数的数我们称之为合数,1和0即非素数也非合数 最小的素数是2,而最大的素数并不存在,这一点欧几里德已在其几何原本中证明。判断一个数是不是素数的C+程序#include #include using namespace std;int main() int i,m,k; cinm; k = sqrt(m); for(i=2;i=k;i+)/逻辑判断条件i=k换成im或换成im/2下面程序也做相应的改动也/正确,但不是最优程序,下面程序即利用ik)coutm is a prime numbern; elsecoutm is not a prime numbern;return 0;/*下面程序即利用im判断:for(i=2;im;i+) if(m%i=0)break;if(i=m) /此处不同coutm is a prime numbern; elsecoutm is not a prime numbern; */输出100以内所有素数 #include using namespace std;void main() int i,j; int k=0; for(i=i;i=100;i+) /另一种判断素数的方法if(i=2)couti=2;j-) if(i%j=0) break; if(j=2) couti ;k+; if(k%3=0)coutendl; cout总共个数是:k=k+1)s+=sqrt(m);return s;5、(往届上机题)斐波纳契数列(一种整数数列,其中每个数等于前面两个数之和)即0,1,1,2,3,5,8,13请编写一个递归函数fun(),实现输出斐波纳契数列的第n个数。#include #include /此头文件可用来下列程序设置输出格式using namespace std;int fun(int n); /递归函数声明void main()for(int i=0;i=19;i+)if (i%5=0)coutendl;/cout.fill(*);/这种方法与下面setfill(*)效果等同coutsetfill(*)leftsetw(6)fun(i) ;/setw()只对一次输入和输出有效;left,rightcoutendl;int fun(int n)if(n=0)return 0;if(n=1)return 1;return fun(n-1)+fun(n-2);5、冒泡法排序。冒泡法排序:#include #define N 10using namespace std;void main()int i,j,t,aN=9,8,7,6,5,4,3,2,1,0;for(j=0;jN-1;j+)for(i=0;iai+1)t=ai;ai=ai+1;ai+1=t;for(j=0;jN;j+)coutaj ;coutendl; #include using namespace std;const int N=10;/或#define N 10;void bubble(int a,int n);void swap(int &a,int &b);void main()int aN;for(int j=0;jaj;bubble(a,N);for(j=0;jN;j+)coutaj ;coutendl;void bubble(int a,int n)/冒泡法int i,j;for(j=0;jn-1;j+)for(i=0;iai+1)swap(ai,ai+1);void swap(int &a,int &b)int t;t=a;a=b;b=t;选择法排序:#include #define N 10using namespace std;void select(int a,int n);void swap(int &,int &);void main()int aN;for(int j=0;jaj;select(a,N);for(j=0;jN;j+)coutaj ;coutendl;void select(int a,int n)/选择法 int i,j,k; for(i=0;in-1;i+) k=i; for(j=i+1;jaj) k=j; swap(ai,ak); void swap(int &a,int &b)int t;t=a;a=b;b=t;冒泡法:只要是每挨着的两个数都要排序的就叫做冒泡法。选择法:每一大趟选择出一个最小或最大最小的。下面是咱上课讲的一个不太规范但最好理解的一个排序法:void select(int a,int n) int i,j,t;for(i=0;in-1;i+)for(j=i+1;jaj)t=ai;ai=aj;aj=t;用文件流完成冒泡法排序程序如下:#include #include using namespace std;const int N=10;/或#define N 10;void sort(int a,int n);void swap(int &a,int &b);void main()int aN;辗转相除,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。它是已知最古老的算法, 其可追溯至公元前300年。它首次出现于欧几里德的几何原本(第VII卷,命题i和ii)中,而在中国则可以追溯至东汉出现的九章算术。它并不需要把二数作质因子分解。 辗转相除法的证明证明: 设两数为a、b(ba),求它们最大公约数(a、b)的步骤如下:用b除a,得abq1r1(0rb)。若r1=0,则(a,b)b;若r10,则再用r1除b,得brq2r2(0r2r1)。若r20,则(a,b)r1,若r20,则继续用r2除r1,如此下去,直到能整除为止。其最后一个非零余数即为(a,b)。 辗转相除法的算法算法 辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的: 1. 若 r 是 a b 的余数, 则 gcd(a,b) = gcd(b,r) 2. a 和其倍数之最大公因子为 a。 另一种写法是: 1. a b,令r为所得余数(0rb) 若 r = 0,算法结束;b 即为答案。 2. 互换:置 ab,br,并返回第一步。ifstream indata(shuzu.txt); /*不鼓励用这种方法,鼓励用上课那种方法:ifstream indata;indata.open(shuzu.txt); */ofstream outdata(r

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论