上机练习十三

导航:复试上机历年真题,题目未搜集全
十四:2003 十三:2004
十二:2005 十一:2006
十:2007 九:2008
八:2009 七:2012
六:2013 五:2014
四:2015 三:2017
二:2018 一:2019

十三、2004

1、发工资

题目:
输入几名职工工资金额,统计最少须领多少个 100 元,50 元,20 元,10 元,5 元,2 元,1 元,5 角,2 角,1 角,5 分,2 分,1 分才能实现顺利发放?
假设职工数 n=5,工资分别为:786.98,1038.76,1053.72,1234.98,1653.33

代码:

#include<stdio.h>
#include<string.h> 
#include<algorithm>
#include<math.h> 
using namespace std;

//输入几名职工工资金额,统计最少须领多少个 100 元,50 元,20 元,10 元,
//5 元,2 元,1 元,5 角,2 角,1 角,5 分,2 分,1 分才能实现顺利发放?
//假设职工数 n=5,工资分别为:786.98,1038.76,1053.72,1234.98,1653.33

//要存储0.1实际上存储的是0.99999...造成计算出错 ,将输入的比123.44放大成12344再计算 


const int a[13] = {
	10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1,
};//先放大方便计算 

const double b[13] = {
	100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01,
};

int p[13]={0};


int main()
{
	int n, num, i;
	double x;
	fill(p, p+13, 0);

	scanf("%d", &n);	
	while(n--)
	{
		num = 0;
		scanf("%lf", &x);
		x = int(x*100);
		while(x!=0)
		{
			i = x / a[num];//除数 
			x -= i * a[num];//余数 
			p[num] += i;
			num++;
		}
//		printf("i=%f, x=%f, int(i)=%d, num=%d, p[%d]=%d\n", i, x, int(i), num, num, p[num]);
	}
	
	
	for(int j=0;j<13;j++)
	{
		if(p[j]!=0) 
			printf("需要%6.2f的%d张\n", b[j], p[j]);
	}
	
	return 0;
}



2、二叉排序树

题目:
建立二叉排序树(二叉链表方式),输出排序结构 H,A,X,F,T,B@(@作为结束)
代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;


typedef struct BSTNode
{
	char data;
	struct BSTNode *lchild, *rchild;
}BSTNode, *BSTree;


void insert(BSTree *bst, char ch)
//逐个插入节点 
{
	if(*bst==NULL)
	{
		BSTNode *p = new BSTNode;
		p->data = ch;
		p->rchild = p->lchild = NULL;
		*bst = p;
	}
	else if((*bst)->data > ch)
		insert(&((*bst)->lchild), ch);
	else if((*bst)->data < ch)
		insert(&((*bst)->rchild), ch);
}


void creatBST(BSTree *bst, char str[])
//创建二叉排序树 
{
	int len=strlen(str);
	*bst = NULL;
	for(int i=0;i<len-1;i++)
		insert(bst, str[i]);
}



void inTravel(BSTree bst)
//中序遍历 
{
	if(bst!=NULL)
	{
		inTravel(bst->lchild);
		printf("%c", bst->data);
		inTravel(bst->rchild);
	}
}


int main()
{
	char str[20];
	BSTree bst;
	gets(str);
	creatBST(&bst, str);
	inTravel(bst);
	
	return 0;
 } 

3、打印菱形

题目:
打印菱形

// 输入n打印以下n边图形:
//   A
//  B*B
//  C***C
// D*****D
//E*******E
// D*****D
//  C***C
//   B*B
//    A

代码:

#include<string.h>
#include<stdio.h>


int main()
{
	int i, j;
	int n;
	scanf("%d", &n);
	for(i=1;i<=n;i++)//上三角 
	{
		for(j=n-i;j>=1;j--)
			printf(" ");
		
		for(j=1;j<=2*i-1;j++) 
		{
			if(j==1||j==2*i-1)//只需在此做一次判断,输出是否为字母或者字符
				printf("%c", i-1+'A');
			else
				printf("*");				
		}
		printf("\n");
	}
	
	int t, k;//k为总共需要打印几行 
	t = n+1;
	if(n%2==1)
		k = n*2-1;
	else
		k = n*2;
	
	
	for(i=t;i<=k;i++)//下三角 
	{
		for(j=1;j<=i-n;j++)
			printf(" ");
		
		for(j=1;j<=(k-i+1)*2-1;j++)
		{
			if(j==1||j==(k-i+1)*2-1)//只需在此做一次判断,输出是否为字母或者字符
				printf("%c", k-i+'A');
			else
				printf("*");	
		}		
		printf("\n");	
	}	
	
	
	return 0;
 } 
 

 

4、字符平台

题目:
求字符平台中的最大字符平台:
一个字符串中的任意一个子序列,若子序列中个字符均相同则称字符平台,输入任意字符串 S 时,输出 S 中长度最大的所有字符平台的起始位置以及所含字符,注意字符平台有可能不止一个 AAZZZXYTTT
代码:

#include<stdio.h>
#include<string.h> 
#include<algorithm>
using namespace std;

//求字符平台中的最大字符平台:
//一个字符串中的任意一个子序列,若子序列中个字符均相同则称字符平台,
//输入任意字符串 S 时,输出 S 中长度最大的所有字符平台的起始位置以及所
//含字符,注意字符平台有可能不止一个 AAZZZXYTTT

const int maxn=50;


typedef struct platform{
	int pos;
	int len;
	char ch;//仅记录字符, 
	platform(){
		len = 0;
		pos = -1;
	}
}plat;


plat p[maxn];
int num=0;


int main()
{
	char str[maxn];
	int i, j;
	gets(str);
	for(i=0;i<strlen(str);i=j)
	{
		p[num].ch = str[i];//将该字符串存入平台数组p ,即使长度为1也要存入 
		p[num].pos = i;
		p[num].len = 1;
		j = i+1;
		while(str[j]==str[i])//相同,则继续进行匹配 
		{
			p[num].len++;
			j++;
		}
		num++;
	}
	
//	for(i=0;i<num;i++)
//		printf("ch=%c, len=%d, pos=%d\n", p[i].ch, p[i].len, p[i].pos);
	
	int k=0;//用k来寻找最大的子字符串长度
	for(i=0;i<num;i++)
		if(p[i].len>k)
			k = p[i].len;
			
	for(i=0;i<num;i++)//因为有多个长度相同的字符平台 
		if(p[i].len==k)
			printf("字符平台字符为%c,长度为%d,在原串的起始位置为%d\n", p[i].ch, p[i].len, p[i].pos+1);	
	
	
	return 0;
 } 

5、链式模式匹配

题目:
链式存储方式下模式匹配
设主串 s,字串 t 分别以单链表存储,t 和 s 中每个字符均用以结点表示如下图:
data-next
实现在链式存储方式下的模式匹配,即求字串 t 在主串 s 中第一次出现的位置指针
代码:

#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;


typedef struct Node
{
	struct Node *next;
	char data;
}Node, *Strlink; 

const int maxn = 20;


Strlink creatStrlink(char str[])
//尾插法创建 
{
	Strlink L;
	Node *r, *q;
	int len, i;
	L = new Node;
	L->next = NULL;
	r = L;
	len = strlen(str);
	
	for(i=0;i<len;i++)
	{
		q = new Node;
		q->data = str[i];
		q->next = NULL;
		r->next = q;
		r = q;
	}
	return L;
}


void travel(Strlink L)
//遍历链表 
{
	Node *q;
	q = L->next;
	while(q!=NULL)
	{
		printf("%c", q->data);
		q = q->next;
	}
	printf("\n");
 } 
 
 
Node* strLinkMatch(Strlink s, Strlink t)
{
	Node *q,*p, *m, *n;
	p = s->next; m = p;
	q = t->next; n = q;
	
	
	if(q==NULL)//空串可以任意匹配 
		return p;
	
	while(n!=NULL&&m!=NULL)
	{
		if(m->data==n->data)
		{
			m = m->next;
			n = n->next;
		}
		else//匹配失败,模式串指针后移,重新匹配 
		{
			p = p->next;
			m = p;
			n = q;	
		}
	}
	
	if(n==NULL)//此时说明子串已经匹配完成
		return p;
	else
		return NULL;
}


int main()
{
	Strlink S, T;
	Node *k=NULL; 
	char s[maxn], t[maxn];

	gets(s);
	gets(t);
	
	S = creatStrlink(s);
	T = creatStrlink(t);
	
	k = strLinkMatch(S, T);
	if(k!=NULL)
		printf("匹配完成\n");
	else 
		printf("匹配失败\n");
	
	
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/welan/p/12727503.html