博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

做错的笔试题汇总

Posted on 2011-09-05 17:00  李大嘴  阅读(761)  评论(0编辑  收藏  举报

设在内存中有P1、P2、P3三道程序,并按照P1、P2、P3的优先次序运行,其内部计算和I/O操作时间由下图给出:
P1:计算 60ms----------------I/O 80ms-----------------计算 20ms
P2:计算 120ms--------------I/O 40ms-----------------计算 40ms
P3:计算 40ms----------------I/O 80ms-----------------计算 40ms
调度程序的执行时间忽略不计,完成这三道程序比单道运行节省的时间是(C )
A、80ms   B、120ms  C、160ms   D、200ms

解析:首先P1计算60ms,然后I/O 80ms,在这80ms中,P2也同步开始计算,等P1的I/O运行完了,CPU停止P2的计算,转去做P1后期那20ms的运算,至此所花时间为60+80+20=160ms;然后CPU再去接着运算P2,40ms,然后p2I/O运行40ms,在此期间,cpu去计算p3,正好也是40ms,算完之后接着算p2的后期部分,40ms,在此期间,因为p3的前40ms已经计算完成,可以进行i/o操作,所以同时p3的i/o也开始运行,运行80ms,这80ms中,前40msCPU在算P2,后40msCPU在算P3,所以是:40+40+40+80=200ms,加上前面的160,为360ms。
而如果是单道运行,则时间花费为:60+80+20+120+40+40+40+80+40=520ms,相差为520-360=160ms ,选c


二分搜索(递归与非递归)

int bsearch1(int a[], int x, int low, int high)
{
	if (low > high)	return -1;
	int mid = (low+high)/2;
	if (x<a[mid]) return bsearch1(a,x,low,mid-1);
	else if(x>a[mid]) return bsearch1(a,x,mid+1,high);
	else return mid;
}

int bsearch2(int a[], int x, int len)
{
	int low = 0;
	int high = len-1;
	while (low<=high)
	{
		int mid = (low+high)/2;
		if (x<a[mid]) high=mid-1;
		else if (x>a[mid]) low=mid+1;
		else return mid;
	}
	return -1;
} 

题目:求符合指定规则的数。
给定函数d(n) = n + n的各位之和,n为正整数,如 d(78) = 78+7+8=93。 这样这个函数可以看成一个生成器,如93可以看成由78生成。
定义数A:数A找不到一个数B可以由d(B)=A,即A不能由其他数生成。现在要写程序,找出1至10000里的所有符合数A定义的数。
输出:
1
3

#include<iostream>
using namespace std;

#define MAX_AREA 10000

int main()
{
	unsigned int t=MAX_AREA/32,t1;
	unsigned int mem_tmp[MAX_AREA/32]={0};
	unsigned int tmp,tmp1,j;
	for(int i=3;i<=MAX_AREA;++i){
		tmp=j=i;
		//caculate the sum
		do{
			tmp+=j%10;
			j/=10;
		}while(j!=0);

		//fill the mem
		t1=tmp/32;
		if(t1>t)
		{
			cout<<"================="<<endl;
			continue;
		}
		mem_tmp[t1]|=((unsigned int)1<<(tmp%32-1));
	}
	
	//now output
	for(i=3;i<=MAX_AREA;++i){
		if(!(mem_tmp[i/32]&(unsigned int)1<<(i%32-1))){cout<<i<<endl;}
	}

	return 0;
}