2006年浙江大学计算机及软件工程研究生机试真题
2016-04-01 02:41
387 查看
题目1015:还是A+B
题目描述:读入两个小于10000的正整数A和B,计算A+B。需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。
输入:
测试输入包含若干测试用例,每个测试用例占一行,格式为"A B K",相邻两数字有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即A+B的值或者是-1。
样例输入:
1 2 1 11 21 1 108 8 2 36 64 3 0 0 1
样例输出:
3 -1 -1 100
#include<iostream> #include<math.h> using namespace std; int main() { int a,b,k,tmp; while(cin>>a>>b&&a&&b) { cin>>k; tmp=pow(10,k); if(a%tmp==b%tmp) { cout<<"-1"<<endl; } else cout<<a+b<<endl; } return 0; }
题目1017:还是畅通工程
题目描述:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
输入:
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
输出:
对每个测试用例,在1行里输出最小的公路总长度。
样例输入:
3 1 2 1 1 3 2 2 3 4 4 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0
样例输出:
3 5
/* 最小生成树能够保证整个拓扑图的所有路径之和最小,但不能保证任意两点之间是最短路径。 最短路径是从一点出发,到达目的地的路径最小。 */ #include<iostream> #include<string.h> #include<algorithm> using namespace std; int pre[105]; struct node{ int st; int en; int cost; }a[10000]; int find(int x)//找到x的上级 { int r=x; while(pre[r]!=r)//如果r的上级不是r,即r不是根节点 r=pre[r];//r是根节点 /////////////路径压缩,将所有下属的上级都设置为根节点 int i=x,j; while(pre[i]!=r) { j=pre[i];//记录i的上级 pre[i]=r;//将r的上级设置为根节点 i=j;//对上级继续处理 } ///////////////////////// return r;//返回根节点 } int cmp(struct node a,struct node b) { return a.cost<b.cost?1:0; } int main() { int sum,n,count; while(cin>>n&&n) { for(int i=1;i<=n*(n-1)/2;i++) cin>>a[i].st>>a[i].en>>a[i].cost; for(int i=1;i<=n;i++)//初始化,将n个村庄看成n个独立的分支,每个的祖先就是自己 pre[i]=i; sort(a+1,a+1+n*(n-1)/2,cmp);//将所有的边从小到大排序 sum=0; count=0; for(int i=1;i<=n*(n-1)/2;i++) { //合并函数 int fx = find(a[i].st); int fy = find(a[i].en); if (fx != fy){ pre[fx] = fy; sum += a[i].cost; count++; } // if(count==n-1)//说明所有的顶点都已经连接了 ,count为连接的边数 break; } cout<<sum<<endl; } return 0; }
题目1019:简单计算器
题目描述:读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
输入:
测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。
输出:
对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。
样例输入:
1 + 2 4 + 2 * 5 - 7 / 11 0
样例输出:
3.00 13.36
#include<iostream> #include <cstdio> #include <stdlib.h> #include<string.h> using namespace std; const int MaxSize= 300; //符号栈 struct opstack{ char data[MaxSize];//存储操作符 int top;//指向栈顶的指针 }op; //数值栈 struct ststack{ float data[MaxSize];//存储操作符数 int top;//指向栈顶的指针 }st; //将算术表达式exp转换为后缀表达式postexp void trans(char exp[],char postexp[]){ char ch; int i=0,j=0; //i扫描exp的下标,j扫描postexp的下标 op.top=-1; ch=exp[i]; i++; while (ch != '\0') { switch(ch){ case '(': //左括号 op.top++; op.data[op.top]=ch; break; case ')': //右括号 while(op.data[op.top]!='(')//若遇到右括弧“)”,则连续出栈输出,直到遇到左括弧“(”为止。其中,左括弧出栈但是并不输出 { postexp[j]=op.data[op.top]; j++; op.top--; } op.top--; break; case '+': //为'+'或'-'时,其优先级不大于栈顶任何运算符的优先级,直到')' case '-': while (op.top!=-1 && op.data[op.top]!='(') { postexp[j]=op.data[op.top]; j++; op.top--; } op.top++; op.data[op.top]=ch; break; case '*': case '/': //为'*'或'/'时,其优先级不大于栈顶为'*'或'/'的优先级,直到')' while(op.top!=-1 && op.data[op.top]!='(' && (op.data[op.top]=='*' || op.data[op.top]=='/')){ postexp[j]=op.data[op.top]; j++; op.top--; } op.top++; op.data[op.top]=ch; break; case ' ': break; //过滤空格 default: while (ch>='0' && ch<='9') { postexp[j]=ch; j++; ch=exp[i]; i++; } i--; postexp[j]='#'; j++; //postexp[j]=' '; j++; //用空格标识一个数值串结束 } ch=exp[i]; i++; } while(op.top!=-1){ //此时,exp扫描完毕,栈不空时出栈并存放到postexp中 postexp[j]=op.data[op.top]; j++; op.top--; } postexp[j]='\0'; //给postexp表达式添加结束标识 } //对后缀表达式postexp求值 float compvalue(char postexp[]){ float d; char ch; int i=0; st.top=-1; ch=postexp[i]; i++; while (ch!='\0') { switch(ch){ case '+': st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];//遇到操作符就弹出两个数 并将结果进栈 st.top--; break; case '-': st.data[st.top-1]=st.data[st.top-1]-st.data[st.top]; st.top--; break; case '*': st.data[st.top-1]=st.data[st.top-1]*st.data[st.top]; st.top--; break; case '/': if(st.data[st.top]!=0) st.data[st.top-1]=st.data[st.top-1]/st.data[st.top]; else{ printf("\n\t除零错误!\n");//防止除数为0 exit(0); } st.top--; break; default: d=0; while (ch>='0' && ch<='9')//遇到操作数就进栈直到#为止 { d=10*d+ch-'0'; ch=postexp[i]; i++; } st.top++; st.data[st.top]=d; } ch=postexp[i]; i++; } return st.data[st.top];//输出栈顶元素就是结果 } int main() { char exp[300]; while(gets(exp)&&strcmp(exp,"0")){ char postexp[300]; float f=0.0; //求exp的逆波兰式,得到postexp trans(exp,postexp); //对postexp求值 f=compvalue(postexp); printf("%.2f\n",f); } return 0; }
相关文章推荐
- ASP.NET global.asax、httpHandlers、httpModules 后门-园长
- note-网络-UDP
- 《HTTP权威指南》读书笔记(第一章~第三章)
- 从C10K到C10M高性能网络的探索与实践
- H3C S3100V2 进web界面只显示不显示配置菜单,只有网络诊断
- iOS9 HTTP不能正常使用的解决方法
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- linux网络发包性能优化
- VIEWGOOD(远古)外语院系流媒体网络电视平台应用方案
- 神经网络凸优化
- Codeforces 270E Flawed Flow 网络流问题
- 如何让你的网站支持https
- Socket编程—TcpListener和TcpClient的使用
- 网络端口号大全
- 网络层和传输层
- 《大话数据结构》第9章 排序 9.10 总结回顾
- TCP-IP协议详解学习笔记-- ICMP
- 网络中的那些事儿(五)之校园网规划综述
- 使用iptables作为网络防火墙构建安全的网络环境
- win10系统iis下部署搭建https (ssl/tls)本地测试环境