应用题
1.设三对角矩阵Anxn按行优先顺序,压缩存储在数组B[3*n-2]之中,求:用i,j表示k的下标变换公式;用k表示i,j的下标变换公式。
设数组B从B[1]开始存储
k = 2i+j-2
i = int((k+1)/3)
j = k+2-2i(其中i从上式求出)
2.已知三维数组M[2---3,-4---2,-1---4],且每个元素占用2个存储单元,起始地址为100,按列下标优先顺序存储,求:M所含的数据元素个数;M[2,2,2],M[3,-3,3]的 存储地址。
元素个数为:2 * 7 * 6 = 84
100 + 2 * (6 * 6 + 3) = 178
100 + 2 * (1 * 7 * 6 + 1 * 6 + 4 ) = 204
3.令s="aaab",t=“abcabaa”,试分别求出它们的next函数值。
s_next = [0,1,2,0]
t_next = [0,0,0,1,2,1,1]
怎么理解kmp算法中的next数组?www.zhihu.com算法设计题(选做4和8)
2.一个文件中有40亿个整数,每个整数为4个字节,内存为1GB,写出一一个算法,求出这个文件的整数里不包含的一个整数。
使用bitmap算法即可
4.编写一个程序,生成大于10000 的随机整数。输出该整数,然后以英文单词的形式输出整数中的各个数字。例如,如果生成的整数是345 678,则输出应该是:The value is 345678
three four five six seven eight
/* 简单题,注意rand函数的使用即可#include <stdlib.h>#include<time.h> srand((unsigned int)time(0));//初始化种子为随机值*/
#include<stdio.h>
#include <stdlib.h>
#include<time.h>
int main()
{
srand((unsigned int)time(0));//初始化种子为随机值
int num;
int wei[100];
int i = 0;
num = rand() + 10001;
printf("The value is %d n", num);
while (num > 0)
{
wei[i] = num % 10;
i++;
num = num / 10;
}
for(i = i - 1;i >= 0;i--)
{
switch (wei[i])
{
case 0:
printf("zero ");
break;
case 1:
printf("one ");
break;
case 2:
printf("two ");
break;
case 3:
printf("three ");
break;
case 4:
printf("four ");
break;
case 5:
printf("five ");
break;
case 6:
printf("six ");
break;
case 7:
printf("seven ");
break;
case 8:
printf("eight ");
break;
case 9:
printf("nine ");
break;
}
}
return 0;
}
8.若在矩阵Amxn中存在-一个元素A[i-1][j-1]满足:A[i-1][j-1]是第 i行元素中最小值,且又是第j列元素中最大值,则称此元素为该矩阵的一-个 马鞍点。假设以二维数组存储矩阵Amxn,试设计求出矩阵中所有马鞍点的算法,并分析所设计算法在最坏情况下的时间复杂度。
/*本算法为朴素算法,但是可以根据已经遍历的数据得到的结果对将要遍历的数据进行优化
遍历N*M矩阵的每个元素,如果该行有大于它的元素,break
若未找到,查看列,如果有小于它的元素,break
输出该元素行与列(行列从0开始计算)
算法复杂度O((M*N)^2)
*/
#include<stdio.h>
int main()
{
int n, m, i, j, k, l, minn, maxx, flag ;
int a[256][256];
while(1)
{
printf("input hang lie: n");
scanf("%d %d",&n,&m);
printf("input jv zheng: n");
for(i=0; i<n; i++)
for(j=0; j<m; j++)
scanf("%d",&a[i][j]);
flag=0;
printf("shuchu hang lie: n");
for(i=0; i<n; i++)
{
for( j = 0; j < m; j++)
{
minn = a[i][j];
for( k = 0 ; k < m; k++)
{
if( minn > a[i][k])
break;
}
if( k==m)
{
maxx=a[i][j];
for(l=0; l<n; l++)
{
if(maxx<a[l][j])
break;
}
if(l==n)
{
printf("%d %d %dn",i , j ,a[i][j]);
flag = 1;
}
}
}
}
if(flag==0)
printf("mei you ma an dian:n");
}
return 0;
}