返回顶部

上机练习十三

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

github汇总链接

十三、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>

using namespace std;


typedef struct plat{
	char ch;
	int pos;
	int n;
	plat()
	{
		pos=0;
		n=0;
	}
}plat;


plat p[100];
int num=0;


int main()
{
	char str[100];
	int len;
	gets(str);
	len = strlen(str);
	
	for(int i=0;i<len;i++)
	{
		if(i==0)//第一个字符必当占一个字符平台 
		{
			p[num].ch = str[i];
			p[num].pos = i;
			p[num].n++;
		}
		else//要判断连续的字符是否相同, 
		{
			if(str[i]==str[i-1])//如果相同字符平台长度加1
			{
				p[num].n++;	
			}	
			else//不相同新增一个字符平台
			{
				num++;
				p[num].ch = str[i];
				p[num].pos = i;
				p[num].n++;	
			}
		}
	}
	
	int k=0;
	for(int i=0;i<=num;i++)//找出最大的字符平台的长度 
		if(p[i].n>k)
			k=p[i].n;
	
	
	for(int i=0;i<=num;i++)
		if(p[i].n==k)
			printf("%c %d %d\n", p[i].ch, p[i].pos, p[i].n);
	
	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;
}

汇总链接

github汇总链接

posted on 2020-04-18 19:05  weilanhanf  阅读(518)  评论(0编辑  收藏  举报

导航