上机练习十三
导航:复试上机历年真题,题目未搜集全
十四: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>
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;
}
汇总链接
posted on 2020-04-18 19:05 weilanhanf 阅读(518) 评论(0) 编辑 收藏 举报