北航研究生复试机试真题-2009年

这篇博客包含了三个编程问题的解决方案:首先使用迭代方法计算立方根,接着是一个非降序排序数组并输出元素顺序的算法,最后展示了一个在文本文件中查找并删除特定字符串的程序。这些代码实例涵盖了数值计算、数组操作和文件处理等基本编程技巧。

2009年北航机试真题

1、迭代立方根

立方根的逼近迭代方程是y(n+1)=y(n)2/3+x/(3y(n)*y(n)),其中y0=x,求给定的x经过n次迭代后的立方根的值。

自做代码:

#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
	int n;
	double x;
	cin>>x>>n;
	double y=x;
	for(int i=1;i<=n;i++)
	{
		y=y*2.0/3.0+x/(3.0*y*y);
	}
	printf("%.6lf",y);
	return 0;
} 

2、数组排序

大概意思是给你一个数组,要求非降序排序后,输出原序列中的各数排序的位置。

样例输入:
4
-3 75 12 -3
样例输出:
1 3 2 1
解释:第一个数-3和第四个数-3都是最小的,排序第一。75最大排序第3。

自做代码:

#include<iostream>
using namespace std;
#include<algorithm>

struct node
{
	int num;
	int iid;
	int order;
}nums[100];

bool cmp(node a,node b)
{
	return a.num<b.num;
}

int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>nums[i].num;
		nums[i].iid=i;
	}
	sort(nums,nums+n,cmp);
	for(int i=0;i<n;i++)
	{
		nums[i].order=i+1;
	}
	for(int i=0;i<n-1;i++)
	{
		if(nums[i].num==nums[i+1].num)
		{
			for(int j=i+1;j<n;j++) nums[j].order--;
		}
	}
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(nums[j].iid==i) cout<<nums[j].order<<" ";
		}
	}
	return 0;
}

3、字符串查找删除
输入一个字符串。删除in.txt文件中的该字符串并输出到out.txt文件中,要求空格统一放到行首输出。

自做代码:

#include<iostream>
using namespace std;
#include<queue>
#include<fstream>
#include<cstdio>
#include<cstring>

ofstream out("out.txt");

int *get_next(char *pattern)
{
	int n=strlen(pattern);
	int *next=new int[n];
	int i=1,len=0;
	next[0]=0;
	while(i<n)
	{
		if(pattern[i]==pattern[len])
		{
			len++;
			next[i]=len;
			i++;
		}
		else
		{
			if(len>0) len=next[len-1];
			else
			{
				next[i]=len;
				i++;
			}
		}
	}
	for(int i=n-1;i>0;i--) next[i]=next[i-1];
	next[0]=-1;
	return next;
}

void kmp(char *test,char *pattern)
{
	int n=strlen(test);
	int m=strlen(pattern);
	int i=0,j=0;
	int *next=get_next(pattern);
	int flag=0;
	while(i<n)
	{
		if(j==m-1 && test[i]==pattern[j]) 
		{
			for(int k=flag;k<i-m+1;k++) 
			{
				if(test[k]!=' ')
					out<<test[k];
			}
			flag=i+1;
			j=0;i++;
			if(i>=n) break;
		}
		if(test[i]==pattern[j]) {
		i++;j++;}
		else
		{
			j=next[j];
			if(j==-1) i++,j++;
		}
	}
	if(flag<n)
	{
		for(int k=flag;k<n;k++) out<<test[k];
	}
}

int main()
{
	char pattern[50];
	char *test=new char[2000];
	gets(pattern);
	ifstream in("in.txt");
	char ch;
	int cnt=0,blank=0;
	while(in.get(ch))
	{
		if(ch=='\n')
		{
			test[cnt]='\0';
			for(int k=0;k<blank;k++) out<<" ";
			cnt=0;blank=0;
			kmp(test,pattern);
			out<<"\n";
		}
		else 
		{
			test[cnt++]=ch;
			if(ch==' ') blank++;
		}
	}
	if(cnt!=0)
	{
		test[cnt]='\0';
		for(int k=0;k<blank;k++) out<<" ";
		kmp(test,pattern);
		out<<"\n";
	}
	return 0;
}
/*
测试:
输入串:ababa
in.txt
abab a abbabababbababacc
abab a a b babababbababacc
abab a a b  babababbababacc
abab a a b   babababbababacc
out.txt
  ababaabbbbcc
    ababaabbbbcc
     ababaabbbbcc
      ababaabbbbcc
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值