1 / 18
文档名称:

算法设计与分析实验报告.doc

格式:doc   大小:300KB   页数:18页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

算法设计与分析实验报告.doc

上传人:ipod0b 2017/7/26 文件大小:300 KB

下载得到文件列表

算法设计与分析实验报告.doc

文档介绍

文档介绍:算法设计与分析实验报告一
实验名称统计数字问题评分
实验日期 2012 年 11 月 15 日指导教师 刘长松
姓名专业班级学号


1、掌握算法的计算复杂性概念。
2、掌握算法渐近复杂性的数学表述。
3、掌握用C++语言描述算法的方法。
,验证算法的时间复杂性函数。

统计数字问题
1、问题描述
一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的****惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。
2、编程任务
给定表示书的总页码的10 进制整数n (1≤n≤109) 。编程计算书的全部页码中分别用到多少次数字0,1,2,…,9。

将页码数除以10,得到一个整数商和余数,商就代表页码数减余数外有多少个1—9作为个位数,余数代表有1—余数本身这么多个数作为剩余的个位数,此外,商还代表1—商本身这些数出现了10次,余数还代表剩余的没有计算的商的大小的数的个数。把这些结果统计起来即可。

#include<>
int s[10]; //记录0~9出现的次数
int a[10]; //a[i]记录n位数的规律
void sum(int n,int l,int m)
{ if(m==1)
{int zero=1;
for(int i=0;i<=l;i++) //去除前缀0
{ s[0]-=zero;
zero*=10;
} }
if(n<10)
{
for(int i=0;i<=n;i++)
{ s[i]+=1; }
return;
}//位数为1位时,出现次数加1
//位数大于1时的出现次数
for(int t=1;t<=l;t++)//计算规律f(n)=n*10^(n-1)
{m=1;int i;
for(i=1;i<t;i++)
m=m*10;
a[t]=t*m;}
int zero=1;
for(int i=0;i<l;i++)
{ zero*= 10;
} //求出输入数为10的n次方
int yushu=n%zero; //求出最高位以后的数
int zuigao=n/zero; //求出最高位zuigao
for(i=0;i<zuigao;i++)
{ s[i]+=zero;
} //求出0~zuigao-1位的数的出现次数
for(i=0;i<10;i++)
{ s[i]+=zuigao*a[l];
} //求出与余数位数相同的0~zuigao-1位中0~9出现的次数
//如果余数是0,则程序可结束,不为0则补上所缺的0数,和最高位对应所缺的数
if(yushu==0) //补上所缺的0数,并且最高位加1
{ s[zuigao]++;
s[0]+=l; }
else
{ i=0;
while((zero/=10)>yushu)
{ i++; }
s[0]+=i*(yushu+1);//补回因作模操作丢失的0
s[zuigao]+=(yushu+1);//补回最高位丢失的数目
sum(yushu,l-i-1,m+1);//处理余位数
}}
void main()
{ int i,m,n,N,l;
cout<<"输入数字要查询的数字:";
cin>>N;
cout<<'\n';
n = N;
for(i=0;n>=10;i++)
{ n/=10; } //求出N的位数n-1
l=i;
sum(N,l,1);
for(i=0; i<10;i++)
{ cout<< "数字"<<i<<"出现了:"<<s[i]<<"次"<<'\n'; }}

调试过程,页码出现报错。

算法设计与分析实验报告二
实验名称分治法实现归并排序算法评分
实验日期 2012 年 11 月 26 日指导教师 刘长松
姓名专业班级学号


:当要求解一个输入规模为n,且n的取值相当大的问题时,
如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。那末,对于这类问题分治法是十分有效的。

DanC(p,q)
global n,A[1:n]; in