数据结构练习题Word文档下载推荐.docx
《数据结构练习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数据结构练习题Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
![数据结构练习题Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/1/751ff26c-acd5-4df7-a978-13fd6a09a85a/751ff26c-acd5-4df7-a978-13fd6a09a85a1.gif)
{
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);