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

九度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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值