您的位置:首页 > 其它

浙江大学2006年复试上机题 解题报告

2012-04-13 12:26 267 查看
九度OJ 题目1015:还是A+B

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1111 解决:701

题目描述:

读入两个小于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

//浙大2010:题目1015:还是A+B
//读入两个小于10000的正整数A和B,计算A+B。
//需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。

#include <fstream>
#include <iostream>
using namespace std;

int main()
{
int i, j, k, m, n;
int a, b;
int D[9]={0,10,100,1000,10000,100000,1000000,10000000,100000000};
ifstream cin("ZJU_1015.txt");//
while( cin >> a >> b >> k && a+b ){
if(a%D[k]==b%D[k])
cout << "-1\n";
else cout << a+b << endl;
}
system("pause");
return 0;
}


九度OJ 题目1016:火星A+B

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1259 解决:356

题目描述:

读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……

输入:

测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。

输出:

对每个测试用例输出1行,即火星表示法的A+B的值。

样例输入:

1,0 2,1

4,2,0 1,2,0

1 10,6,4,2,1

0 0

样例输出:

1,0,1

1,1,1,0

1,0,0,0,0,0

九度OJ给这道题标记了5星的最高难度 你信么?如果数学有自信 可以直接把前26个素数写出来 如果想求稳或偷懒 可以写个小程序先输出这些素数 才copy到定义的数组处



然后按位处理大数加法即可 区别是以往是以10进位 现在是以odd[i]进位

//浙大2010:题目1016:火星A+B
//读入两个不超过25位的火星正整数A和B,计算A+B
//在火星上,整数不是单一进制的,第n位的进制就是第n个素数
//相邻位用","隔开

#include <fstream>
#include <memory.h>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
int odd[]={2,3,5,7,11,13,17,19,23,29,31,37,
41,43,47,53,59,61,67,71,73,79,83,89,97,101};
int a[26], b[26],c[26];

int convertToNum( string s ){
int len = s.length();
int result = s[0]-48;
for( int i=1; i<len; i++ )
result = result*10 + s[i] - 48;
//cout << "result=" << result << endl;//
return result;
}

void getNum( string s, int Bit, int d[] ){ //这里不能用a[]做形参因a已是全局变量
int i, j, k;
string t;
if( Bit==0 ){
d[0] = s[0] - 48;
return;
}
while( Bit!=-1 ){
i=s.find(",");
//cout << s << " " << i << endl;//
d[Bit--] = convertToNum( s.substr(0,i) );
s = s.substr(i+1,s.length()-i);
}
}

int main()
{
int i, j, k, m, n;
string A, B;
int alen, blen, Abit, Bbit, maxbit;
ifstream cin("ZJU_1016.txt");//
while( cin >> A >> B && (A!="0"||B!="0") ){
Abit = Bbit = 0;
alen = A.length();
blen = B.length();
for( i=0; i<alen; i++ )
if( A[i]==',' ) Abit++;
for( i=0; i<blen; i++ )
if( B[i]==',' ) Bbit++;
maxbit = max(Abit,Bbit);

////calc odd
//int count =0;
//for( i=2; count<=25; i++ ){
//	bool pass=1;
//	for( j=2; j<=i>>1; j++ )
//		if( i%j==0 ) { pass=0; break; }
//	if(pass) { cout << i << ","; count++; }
//}	cout << endl;

memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
getNum( A, Abit, a );
getNum( B, Bbit, b );

//cout << "A= ";
//for( i=maxbit; i>=0; i-- )
//	cout << a[i] << " ";
//cout << endl;
//cout << "B= ";
//for( i=maxbit; i>=0; i-- )
//	cout << b[i] << " ";
//cout << endl;

c[0] = 0; maxbit++;
for( i=0; i<=maxbit; i++ ){
a[i] = a[i]+b[i]+c[i];
c[i+1] = a[i]/odd[i]; //c[]=进位
a[i] %= odd[i];
}
bool flag = 0;
for( i=maxbit; i>0; i-- ){
if( flag==0 )
if( a[i] ) flag = 1;
if( flag )
cout << a[i] << ",";
}
cout << a[0] << endl;
//cout << endl;//
}
system("pause");//
return 0;
}


九度OJ 题目1017:还是畅通工程

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:466

题目描述:

某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。

输入:

测试输入包含若干测试用例。每个测试用例的第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

暂留

九度OJ 题目1018:统计同成绩学生人数

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1409 解决:800

题目描述:

读入N名学生的成绩,将获得某一给定分数的学生人数输出。

输入:

测试输入包含若干测试用例,每个测试用例的格式为

第1行:N

第2行:N名学生的成绩,相邻两数字用一个空格间隔。

第3行:给定分数

当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。

输出:

对每个测试用例,将获得给定分数的学生人数输出。

样例输入:

3

80 60 90

60

2

85 66

0

5

60 75 90 55 75

75

0

样例输出:

1

0

2

//浙大2010:题目1018:统计同成绩学生人数
//读入N名学生的成绩,将获得某一给定分数的学生人数输出。
//input:
//第1行:N
//第2行:N名学生的成绩,相邻两数字用一个空格间隔。
//第3行:给定分数
//当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。

#include <fstream>
#include <memory.h>
#include <iostream>
using namespace std;

int main()
{
int i, j, k, m, n;
int a[101];
ifstream cin("ZJU_1018.txt");//
while( cin >> n && n ){
memset(a,0,sizeof(a));
for( i=0; i<n; i++ ){
cin >> k;
a[k]++;
}
cin >> j;
cout << a[j] << endl;
}
system("pause");
return 0;
}


九度OJ 题目1019:简单计算器

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1476 解决:500

题目描述:

读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。

输入:

测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。

输出:

对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。

样例输入:

1 + 2

4 + 2 * 5 - 7 / 11

0

样例输出:

3.00

13.36

先用getline把改行字符串喂给字符串变量line 再用istringstream s(line)把line喂给字符串变量s 此时s就具备了输出数据的功能 可供cin获取内容 C的写法还更简洁些 用sscanf直接读char数组即可 然后优先处理乘除 并用两个栈分别保存操作数和操作符 最后for循环处理加减

//浙大2010:题目1019:简单计算器
//读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。
//样例输入:
//    1 + 2
//    4 + 2 * 5 - 7 / 11
//    0
//样例输出:
//    3.00
//    13.36

#include <fstream>
#include <memory.h>
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

int main()
{
int i, j, k, m, n;
string s, t, line;
double num[200], temp;
char op[200];
int opi, numi;	//i=index
ifstream cin("ZJU_1019.txt");//
cout.precision(2);cout.setf(ios::fixed);
while( getline(cin,line) && line!="0" ){
istringstream s(line);
opi = numi = 0;
s >> num[numi];
while( s >> op[opi] >> temp ){
if( op[opi]=='*' )
num[numi]*=temp;
else if( op[opi]=='/' )
num[numi]/=temp;
else { opi++; num[++numi]=temp; }
}
//for( i=0; i<opi; i++ )
//	cout << op[i];
//cout << endl;
//for( i=0; i<numi; i++ )
//	cout << num[i] << " ";
//cout << endl;
for( i=0,j=0; i<opi; i++ ){
if( op[i]=='+' )
num[0]+=num[++j];
else num[0]-=num[++j];
}
cout << num[0] << endl;
}
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: