当前位置:文档之家› BX110937李建辉算法设计实验一

BX110937李建辉算法设计实验一

printf("不是真分数\n");
return 0;
}ห้องสมุดไป่ตู้
printf("%d/%d = ", a, b);
while(1)
{
if(b%a==0) /*若分母是分子的倍数,直接变成埃及分数*/
{
i=b/a;
a=1;
}
else/*否则分解出一个分母为(b/a)+1的埃及分数*/
i=(b/a)+1; /*这个括号不是必须的,为的是看起来更清晰*/
电子信息学院
实验报告书
课程名:算法设计与分析
题 目:实验一C/C++环境及算法复杂度理解
实验类别【设计型】
班 级:BX1109
学 号:37
**********
1.实验目的
(1)熟悉C/C++语言的集成开发环境;
(2)通过简单的算法程序设计,了解算法复杂度的含义。
2.实验内容与步骤
(一)实验内容
(1)分数分解算法描述,把真分数a/b分解为若干个分母为整数分子为“1”的埃及分数之和;
4.结果分析与实验体会
(一)实验结果
图1-1 真分数分解成埃及分数
图1-2 n个1整除2011
图1-3n个1整除2013
(二)结果分析
(1)真分数分解成埃及分数结果分析
1)在寻找埃及分数的过程中,没有采用穷举的方法,尝试所有可能的埃及分数;而是采用计算来直接找到最可能的埃及分数,分母为(b/a)+1,后者效率比前者高。
if(a==1)/*分子为1了,该结束了*/
{
printf("1/%d\n",i);
break;
}
else if(a==3&&b%2==0) /*这块不是必须的,若分子为3分母为偶数,一定可以直接分解成两个埃及分数1/(b/2)+1/b,然后就该结束了*/
{
printf("1/%d + 1/%d\n",b/2,b);
break;
}
else
{
printf("1/%d + ",i);
fflush(stdout);/*这不是必须的,为的是能立即看到每一个分解的埃及分数*/
}
/*从 a/b中减去那个埃及分数*/
a=a*i-b;
b=b*i;
}
return 0;
}
N个1整除2011源程序
#include<stdio.h>
void main()
(2)据例1-2的算法,写出求解n个“1”组成的整数能被2011整除的程序。修改程序,求出 n至少为多大时,n个“1”组成的整数能被2013整除?。
(二)实验步骤
(1)分数分解成埃及分数实验步骤
1)定义变量i,用来保存各个埃及分数的分母;
2)如果分母是分子的倍数,直接约简成埃及分数;
3)否则分数中一定包含一个分母为(b/a)+1的埃及分数;
4)如果分子是1,表明已经是埃及分数,不用再分解,结束;
5)如果分子是3而且分母是偶数,直接分解成两个埃及分数1/(b/2)和1/b,结束;
6)从分数中减去这个分母为(b/a)+1的埃及分数,回到步骤2。
(2)N个1组成的整数能被2011整除的程序,修改程序n至少为多大能被2013整除
1)定义变量a,c,p,n,a代表被除数,c用来代表a除p的余数,如果余数为零则a能够整除p,跳出循环,p代表除数,n用来计算1的个数
2)a等于c乘以10再加1,
3)c等于a除以p,c为零则a整除p,计数n加1
4)否则循环2)和3)
5)C为零循环结束输出1的个数n和被除数a
3.实验原理
算法复杂度:一个算法的时间复杂度是指算法运行所需的时间。一个算法的运行时间取决于算法所需执行的语句(运算)的多少。
算法的时间复杂度通常用该算法执行的总语句(运算)的数量级决定。一条语句的数量级即执行它的频数,一个算法的数量级是指它所有语句执行频数之和。
p=2013;
c=1111;
n=4;
while(c!=0)
{
a=c*10+1;
c=a%p;
n=n+1;
}
printf(" 由%d个1组成的整数能被%d\n",n,p);
}
附:源程序
真数分解成埃及分数源程序
#include<stdio.h>
int main()
{
int a=0, b=1;/*分子分母*/
int i;/*i用来保存每一步分解出的埃及分数的分母*/
printf("请输入一个真分数(a/b):");
scanf("%d/%d",&a,&b);
if(a<1||b<=a){
(三)实验体会
通过这次实验我了解了VC++集成开发环境,加深了对算法复杂程度含义的理解,何谓算法复杂程度,即一个算法的时间复杂度是指算法运行所需的时间。一个算法的运行时间取决于算法所需执行的语句(运算)的多少。算法的时间复杂度通常用该算法执行的总语句(运算)的数量级决定。一条语句的数量级即执行它的频数,一个算法的数量级是指它所有语句执行频数之和。不同的算法其时间复杂度可能不同,我们在编程的时候应该尽量减少算法的时间复杂程度,以此减少计算机对cpu的访问,提高程序的执行进程来优化程序。
{
int a,c,p,n;
p=2011;
c=1111;
n=4;
while(c!=0)
{
a=c*10+1;
c=a%p;
n=n+1;
}
printf(" 由%d个1组成的整数能被%d\n",n,p);
}
N个1整除2013时1的最少个数
#include<stdio.h>
void main()
{
int a,c,p,n;
而枚举法中反复约分,而约分本身又涉及到大量的运算,该算法中都简化掉了。
(2)N个1整数2011实验结果分析
1)能够整除2011必然大于2011,故c初值为四个一,通过循环变为五个一,六个一,不断增加1的个数,直到整除2011则停止,时间复杂度为O(n2)
2) 将除数改成2013就是求能整除2013最小的整数
比如,还用8/11为例,分解出1/2和1/5之后还剩下3/110。用穷举或者计算的方法对3/110的分解结果是
3/110=1/37+1/4070。
用常识的的方法分解结果是
3/110=1/55+1/110。
可以看到,前者分母用到了4070那么大,而后者只用到了110。
3)算法在循环中不做约分操作,直接进行计算,是对算法效率的又一个提高。
比如,对.4/123,穷举法从1/2一直遍历到1/31才找到合适的埃及分数,但该算法用123/4+1=31直接就找到1/31。
2)当分子为3时,该算法用常识做了特殊处理,可以提高分解的效率。
假设用2k来表示一个偶数,我们知道3/(2k)可以分解成1/k + 1/(2k),这样分解直接找到两个目标埃及分数,不用逐个再去分解,更不用穷举。
相关主题