数据结构练习题Word文档下载推荐.docx

上传人:b****3 文档编号:17401326 上传时间:2022-12-01 格式:DOCX 页数:14 大小:22.56KB
下载 相关 举报
数据结构练习题Word文档下载推荐.docx_第1页
第1页 / 共14页
数据结构练习题Word文档下载推荐.docx_第2页
第2页 / 共14页
数据结构练习题Word文档下载推荐.docx_第3页
第3页 / 共14页
数据结构练习题Word文档下载推荐.docx_第4页
第4页 / 共14页
数据结构练习题Word文档下载推荐.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数据结构练习题Word文档下载推荐.docx

《数据结构练习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构练习题Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。

数据结构练习题Word文档下载推荐.docx

{

data[1]=data[2];

if(data[0]==data[1])

printf("

elseprintf("

}

else

if(data[1]==data[2])

printf("

else

for(i=0;

i++)

printf("

%2d"

data[i]);

elseif(n>

3)//当表的元素大于3时//

i=0;

while(i<

n)//循环检测//

while(i<

n-1&

&

data[i]!

=data[i+1])

i++;

//元素i与下一个元素不重复,继续检测//

if(i+2<

n)j=i+2;

//发现重复//

while((j<

n)&

(data[i]==data[j]))

j++;

//元素j是与元素i不重复的元素

for(k=i+1;

j<

k++,j++)

data[k]=data[j];

//前移//

n=k;

i++;

i++)//输出没有重复的顺序表//

%3d"

}

}

2.题目要求:

一个长度为N的数组,包含一到N的正整数,找出其中有两个相等的数

思路:

这道题的第一个想法就是一个个比较,但是要注意到N的最大值达到10^6,而且时间限制为2S。

这样比下去时间复杂度是O(n),但是每次都要比较,明显超时(TimeLimitExceed)。

比较的时间比加减法所花的时间要长(具体长多少还不确定)。

所以这题采用一加一减或者一减一加:

就是在一个循环里(循环从1开始)用一个变量(初始值为0)加上接收进来的数并减去循环变量的值,直到循环结束,要注意一下结果(是正整数)。

#include<

intg()//这个函数接收会更高效

 

charc;

intsum=0;

while((c=getchar())!

='

'

sum=sum*10+c-48;

returnsum;

intmain()

intn;

intval;

registerinti,sum;

while(scanf("

%d%*c"

n)!

=EOF)

sum=0;

for(i=1;

val=g();

sum+=val;

sum-=i;

scanf("

val);

printf("

sum);

return0;

3.以an为参考元素的快速排序。

inta[10000];

inti,j,t,n;

for(i=1;

=n;

a[i]);

j=n;

t=a[n];

//暂存参考元素//

i=1;

j)

j&

a[i]<

=t)i++;

//当前元素不大于参考元素时,指针i后移//

if(i<

j)a[j--]=a[i];

//将大于参考元素的元素后移//

a[j]>

t)j--;

//当前元素大于参考元素时,指针j前移//

j)a[i++]=a[j];

//将小于参考元素的当前元素前移//

a[i]=t;

//参考元素置于分界位置//

for(i=1;

printf("

a[i]);

printf("

\n"

);

4.排序:

voidinsertsort(inta[],intn)//直接插入排序

inti,j;

for(i=2;

i++)//从a[1],a[2],a[3]…….a[n]//

if(a[i]<

a[i-1])

a[0]=a[i];

for(j=i-1;

a[0]<

a[j];

--j)

a[j+1]=a[j];

a[j+1]=a[0];

inti,a[100000],n;

bubblesort(a,n);

voidbubblesort(inta[],intn)//冒泡排序//

inti,j,t;

for(i=0;

n-1;

for(j=n-1;

j>

i;

j--)

if(a[j-1]>

a[j])//从后往前两两比较//

t=a[j-1];

a[j-1]=a[j];

a[j]=t;

voidselectsort(inta[],intn)//简单选择排序//

intmin,i,j,t;

min=i;

for(j=i+1;

j++)

if(a[j]<

a[min])min=j;

t=a[min];

a[min]=a[i];

a[i]=t;

5.试编写一个能在数组L[1….n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素):

intkth_elem(inta[],intlow,inthigh,intk)

intpivot=a[low];

intlow_temp=low;

inthigh_temp=high;

while(low<

high)

while(low<

high&

a[high]>

=pivot)

--high;

a[low]=a[high];

a[low]<

++low;

a[high]=a[low];

//上面即为快速排序中的划分算法//

if(low==k)

returna[low];

elseif(low>

k)

returnkth_elem(a,low_temp,low-1,k);

else

returnkth_elem(a,low+1,high_temp,k);

inti,n,a[100000],k;

i++)/从a[1],a[2],a[3]…….a[n]//

scanf("

k);

kth_elem(a,1,n,k));

6.求N!

的位数:

(用一个数学公式解出来)

math.h>

intn,len;

doublepi,e;

pi=acos((double)(-1));

e=exp(1.0);

len=(int)(log10(sqrt(2*pi*n))+n*log10(n/e)+1);

if(n==1)

len=1;

len);

7.请你编写一个程序,能够将一从左到右书写的文字自动转成从右向左的顺序。

输入的第一行是一个数字n(n<

100),接下来的有n行的文字,由字母、空格、数字以及各种标点组成,每行文字长度不超过200个字符。

将输入的文字转成从右向左的顺序,一行输入对应一行输出。

string.h>

chara[201];

inti,t,j,n;

intcount;

scanf("

count);

getchar();

//吃掉回车//

for(j=0;

=count;

gets(a);

//输入字符串//

n=strlen(a);

for(i=0;

n/2;

t=a[n-1-i];

a[n-1-i]=a[i];

a[i]=t;

puts(a);

//输出字符串//

8.对于给定的n(n≤5*10^6),计算代数式

的值。

doublesum=1;

inti,n;

sum=sum+1/(double)i;

%.12f\n"

9.写一个程序能够将Bob的文章中的英文字母全部变成小写的

chara[51];

while(gets(a)!

\0'

puts(strlwr(a));

//strlwr是将大写编成小写的函数//

10.请编写一个程序,将x分解为若干个素数的乘积。

intIsp(intn)

doublek;

inti;

if(n==1)return0;

k=(double)sqrt(n);

=k;

if(n%i==0)return0;

//n不是素数//

return1;

//n是素数//

voidresolve(intn)//分解//

inti,k,m;

inta[1000];

k=0;

m=n;

=m;

while(m%i==0)

m=m/i;

a[k]=i;

k++;

k-1;

%d*"

a[k-1]);

intx,i,n;

x)!

=x;

n);

if(Isp(n))

n);

resolve(n);

11.求

(其中0<

m<

=3)

intacker(intm,intn)

if(m==1)returnn+2;

elseif(m==2)return3+2*n;

elseif(m==3)

if(n>

0)

returnacker(2,acker(m,n-1));

elseif(n==0)returnacker(2,1);

return0;

intm,n;

%d%d"

m,&

acker(m,n));

12.设2n张牌分别标记为1,2,...,n,n+1,...,2n,初始时这2n张牌按其标号从小到大排列。

经一次洗牌后,原来的排列顺序变成n+1,1,n+2,2,...,2n,n。

即前n张牌被放到偶数位置2,4,...,2n,而后n张牌被放到奇数位置1,3,...,2n-1。

可以证明对于任何一个自然数n,经过若干次洗牌后可恢复初始状态。

现在你的的任务是计算对于给定的n的值(n≤10^5),最少需要经过多少次洗牌可恢复到初始状态。

只需考虑其中一张牌,如1,回到原来位置的次数就是所求的次数。

inti,n,count;

count=0;

do

=n)

{i=i*2;

count++;

else

{i=i-(2*n-i+1);

}while(i!

=1);

count);

13.求a的b次方的值的个位数的和。

inta,b,s,i;

a,&

b)!

if(a==0&

b==0)break;

//a=0,b=0表示输入结束,不需要处理,break是跳出循环体//

if(a==0)

0\n"

continue;

//结束本次循环,进行下一次//

s=1;

b;

i++)//把a的b次方的值%9就是答案//

s=s*a;

s=s%9;

if(s==0)s=9;

s);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1