数学实验报告
题目:四种特殊自然数编程
作者:
学号:
班级:
1. 题目:四种特殊自然数编程,计算出所有的水仙花数,完美数,
亲和数,回文数。
2. 环境:Windows系统 PC MATLAB软件
3. 问题分析
1) 水仙花数:若一个自然数的各位数字的立方和等于该数本身,
则称该自然数为水仙花数。
由水仙花数的定义可知,首先要将一个三位数的百位,十位,个位三个数字分离出来,
同时用for-end循环语句对自然数赋值,然后将三个数字分别赋值给三个变量(如a,b,c),用if条件语句选出符合水仙花数定义的自然数即可。
2) 完美数:对于一个自然数而言,若它的真因子之和小于数本身,
则称该数为盈数,若它的真因子之和大于数本身,则称该数为亏数,若它的真因子之和等于数本身,则称该数为完美数(完全数)。(它的两个特点:它可以写成若干连续自然数之和;它的全部因数的倒数和都是2)
首先考虑到要输出一系列满足条件的自然数,可以使用for-end循环语句,在一定范围内(在此我们考虑2~10000内的自然数)对每一个自然数进行完美数的验证,可以赋值i=2:1:10000,然后就要找出每一个自然数的所有真因子,在此又需要用for-end语句找出一个自然数的所有真因子,分离出真因子并赋值给一个变量如b,最后将所有真因子的和与该自然数比较,此时需要if条件语句,筛选出符合条件的自然数后输出即可。
3) 亲和数:亲和数又叫友好数,是指两个自然数,其中每个自然
数的真因子数之和等于另一个数。例如:220与284就是一对亲和数。
类比完美数,亲和数同样需要求出一个自然数的所有真因子,在此需求出两个自然数的所有真因子对应的和,然后比较。首先需要使用for-end循环语句,while-end循环语句以及if-end条件语句求出一定范围内(在此以2~10000为例)每一个自然数的所有真因子,然后用赋值语句赋值多个变量,利用这些变量以及if-end条件语句选择符合条件的自然数组即可。
4) 回文数:对于一个自然数,若将各位数字倒叙排除,加到原来
的数字上,反复这样多次后,若能得到一个从左到右读与从右到左读完全一样的数,则称该自然数能产生回文数或者对称数。 首先我们可以选定取值范围(在此去1~100),其次我们需要使用
赋值语言,同时需要将数字倒叙的程序,然后用循环和选择语句,即可选出1~100的回文数。
4. 问题解答(实验过程)
1) 水仙花数的编程代码 for i=100:1:999
a=mod(i,10);
b=mod(((i-a)/10),10); c=(i-10*b-a)/100; if i==a^3+b^3+c^3 i
end
end
2) 完美数编程代码 for i=2:1:10000;
a=0;
for b=1:1:i-1
if mod(i,b)==0 a=a+b; end
end
if i==a
i
end
end
3) 亲和数编程代码 for a=2:1:10000
t=1;
n=2;
s=sqrt(a);
s=fix(s);
if a==s^2
t=t+s;
end
while n<s
m=mod(a,n); if m==0
t=t+n+a/n; end
n=n+1;
end
if t>a
b=t;
l=1;
d=2;
p=sqrt(b); p=fix(p);
if b==p^2
l=l+p;
end
while d<p
m=mod(b,d); if m==0
l=l+d+b/d; end
d=d+1;
end
if l==a
[a,b]
end
end
end
4) 回文数编程代码 clear;clc
for n=1:1000
t=0; p=0;
c=n; c1=n;
while p<2
while (c>0)
t=t*10+mod(c,10);
c=c/10;
c=fix(c);
end
if c1==t
fprintf('huiwenshu=%d\n',n);
p=1001;
else
c=t+c1;
p=p+1;
c1=c;
t=0;
end
end
end
5. 实验结果
1)所有水仙花数:153 370 371 407
2)2~10000的所有完美数:6,28,496,8128
3)2~10000的所有亲和数组:220 284, 1184 1210, 2620 2924,5020 5564,6232 6368
4)能产生无数个回文数,有无数个能产生回文数的数,二者最小的数都是1.
6.结果分析
1)水仙花数
153=1^3+5^3+3^3 370=3^3+7^3+0^3
371=3^3+7^3+1^3 407=4^3+0^3+7^3
都符合水仙花数定义
2)完美数
6的所有真因子为1,2,3且6=1+2+3
28的所有真因子为1,2,4,7,14且28=1+2+4+7+14
496有真因子为1,2,4,8,16,31,62,124,248且
496=1+2+4+8+16+31+62+124+248
8128的所有真因子为1,2,4,8,16,32,64,127,254,508,1016,2032,4064.
8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064
都符合完美数定义
3)亲和数
220的真因子:1,2,4,5,10,11,20,22,44,55,110
284的真因子:1,2,4,71,142
220=1+2+4+71+142 284=1+2+4+5+10+11+20+22+44+55+110
二者符合亲和数定义
1184的真因子:1,2,4,8,16,32,37,74,148,296,592 1210的真因子:1,2,5,10,11,22,55,110,121,242,605 二者符合亲和数定义
2620的真因子:1,2,4,5,10,20,131,262,524,655,1310 2924的真因子:1,2,4,17,34,43,68,86,172,731,1462 二者符合亲和数定义
5020的真因子:1,2,4,5,10,20,251,502,1004,1255,2510 5564的真因子:1,2,4,13,26,52,107,214,428,1391,2782 二者符合亲和数定义
6232的真因子:1,2,4,8,19,38,41,76,82,152,164,328,779,1558,3116
6368的真因子:1,2,4,8,16,32,199,398,796,1592,3184 二者符合亲和数定义
4)回文数
1+1=2 2是回文数 1是产生回文数最小的自然数
7.实验反思与结论
第一次做数学实验,第一次接触MATLAB软件,第一次进行简单编程,有许多错误和茫然指出,我在不断的尝试努力中进步着。
通过这次数学实验,我基本掌握了for-end,while-end循环语句以及if-end,if-else-end语句,同时还有各种赋值语句。当然还有MATLAB软件中的一些特殊符号,对实验理论课上学的一些基本操作更加熟练。最重要的是,很好的提高了我的数学逻辑思维,以及上机动手实验操作的能力,这对我以后的学习工作有很大帮助。
第二篇:西安交大C++第一章实验报告
西安交通大学实验报告
课程_C++程序设计教程_实验名称__ C++集成开发环境的使用____第 页 共 页
系 别___ _______ 实 验 日 期 年 月 日
专业班级_ ___组别___________ 实 验 报 告 日 期 年 月 日
姓 名________学号__ 报 告 退 发 ( 订正 、 重做 )
同 组 人_________________________________ 教 师 审 批 签 字
一. 实验目的
了解,学会,
1.C++程序基本要素和结构;
2.算法与程序;
3.用C++解块实际问题的步骤。
二. 实验内容
(-)实验题目一:修改例1-3的加法计算程序,编写一个乘法计算器程序。
1.要点分析
为了可以计算乘法,需要使用支持实数运算的双精度(double)数据类型的变量a,b,c进行运算。
程序在接收输入数据之前,首先显示一行提示信息,告诉用户应该如何输入数据,并在输入结果的同时输出计算公式。
2.程序源代码
#include <iostream.h>
int main()
{
double a,b,c; //定义3个可对实数进行操作的双精度类型变量
cout<<"Please input two numbers: ";
cin>>a>>b;
c = a*b;
cout<<a<<"*"<<b<<"="<<c<<endl;
return 0;
}
3实验结果
(二)实验题目二:参考例1-5,使用梯形法计算下列定积分值。
其中,积分区域等分数可取为200,并比较计算结果和手算结果。
1.要点分析
不失一般性,将积分区域等分为n(这里题目给出是200)份,其中第i个小区间上的定积分
可以使用梯形面积来近似表示。
≈(f(a+ih)+f(a+(i+1)h))
因此整个积分区域上的定积分可以表示为
≈(f(a+ih)+f(a+(i+1)h))=h()
2.程序源代码
#include <iostream.h> // 用梯形法计算定积分
#include <math.h> //包含标准数学函数的math.h函数库
int main()
{
double a=-1.0, b=1.0; // 双精度类型变量: 积分上下限
double h; // 双精度类型变量: 积分步长
double sum;// 双精度类型变量: 存放最后为积分值
int n=200; // 整型变量 : 积分区间等分数
int i=-1; // 整型变量 : 循环工作变量
h = (b-a)/n;// 计算小区间长度
sum=(sin(a)+exp(a)+sin(b)+exp(b))/2;
for(i=1;i<n;i=i+1) // 循环计算公式中的Σ和式
sum=sum+(sin(a+i*h)+exp(a+i*h));
sum=sum*h;
// 输出计算结果
cout<<"The result is " << sum << endl;
return 0;
}
3实验结果
(三)实验题目三: 实现整数拼接。即输入两个只有二位十进制的整数,将这两个整数拼接成四位十进制数,两个数中较大的数放在高位上,较小的数放在低位上。例如:输入45和89,则输出整数8945。
1.要点分析
按题目要求,欲要得到结果,必须先找到哪个是两个数中最大的一个。需要使用支持实数运算的双精度(double)数据类型的变量p,q,r进行运算。
如果p>q,则r自然等于p*100+q
因为不会出现p=q的情况,所以另一种情况只能是p<q,则r就等于q*100+p
2.程序源代码
#include <iostream.h>
int main()
{
//说明3个整行变量
double p,q,r;
//提示用户由键盘输入两个正整数
cout<<"Please input two numbers: "<<endl;
cin>>p>>q;
if(p>q)
{
r = p*100+q;
}
else
r=q*100+p;
cout<<r<<endl;
return 0;
}
3实验结果
(四)实验题目四: 编写程序:实现在屏幕上输出汉字“曲”的形状。(提示:采用英文字符*构成图案形状)
1.要点分析
根据题目要求,程序要显示八行表示“曲”字的横竖比划的“*”符号。
一个空格算一个字符。
所以可以用空格和“*”来表示“曲”字。
2.程序源代码
#include <iostream.h>
int main()
{
cout<< " * * " << endl;
cout<< " * * " << endl;
cout<< " **********" << endl;
cout<< " * * * *" << endl;
cout<< " * * * *" << endl;
cout<< " **********" << endl;
cout<< " * * * *" << endl;
cout<< " * * * *" << endl;
cout<< " **********" << endl;
return 0;
}
3实验结果
三. 个人小结
本人的收获:
(1) 对用C++语言编写较简单的程序程有了一定的了解。
(2) 对课本上的几个例题基本上都已领略了个中精髓。
(3) 在学习过程中,遇到了不少困难,比如有些东西还是很难,无法理解,发现了一些有待解决的问题。
(4) 最后一题,本来自己没有一点思路,看了例题,却不知如何办才好,多亏和同班的同学探讨了一番,受益颇深。