今天闲着没事,就把浙大的上机题目整理做了下。。
第一题:
A + B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 462 Accepted Submission(s): 290
Problem Description
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.
Sample Input
one + two =
three four + five six =
zero seven + eight nine =
zero + zero =
Sample Output
3
90
96
#include
<
iostream
>
using
namespace
std;
string
strnum[
10
]
=
...
{"zero","one","two","three","four","five","six","seven","eight","nine"}
;
int
strToint(
string
str)
...
{
int i;
for(i=0;i<10;i++)
if(str==strnum[i])
return i;
}
int
sum;
bool
Input()
...
{
string first,second;
int num1=0,num2=0;
cin>>first;
cin>>second;
if(second!="+")
...{
num1=strToint(first)*10+strToint(second);
cin>>first;
}else num1=strToint(first);
cin>>first;
cin>>second;
if(second!="=")
...{
num2=strToint(first)*10+strToint(second);
cin>>second;
}else num2=strToint(first);
sum=num1+num2;
if(!num1&&!num2)return false;
else return true;
}
int
main()
...
{
while(Input())
cout<<sum<<endl;
return 0;
}
第二题:
还是A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 799 Accepted Submission(s): 403
Problem Description
读入两个小于10000的正整数A和B,计算A+B。需要注意的是:如果A和B的末尾K(不超过8)位数字相同,请直接输出-1。
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A B K",相邻两数字有一个空格间隔。当A和B同时为0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即A+B的值或者是-1。
Sample Input
1 2 1
11 21 1
108 8 2
36 64 3
0 0 1
Sample Output
3
-1
-1
100
#include
<
iostream
>
using
namespace
std;
int
a,b,k;
int
dive;
int
main()
...
{
while(1)
...{
dive=1;
cin>>a>>b>>k;
if(!a&&!b)break;
while(k--)
dive*=10;
if(a%dive==b%dive)
cout<<-1<<endl;
else
cout<<a+b<<endl;
}
return 0;
}
第三题:
火星A+B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 286 Accepted Submission(s): 117
Problem Description
读入两个不超过25位的火星正整数A和B,计算A+B。需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数。例如:地球上的10进制数2,在火星上记为“1,0”,因为火星个位数是2进制的;地球上的10进制数38,在火星上记为“1,1,1,0”,因为火星个位数是2进制的,十位数是3进制的,百位数是5进制的,千位数是7进制的……
Input
测试输入包含若干测试用例,每个测试用例占一行,包含两个火星正整数A和B,火星整数的相邻两位数用逗号分隔,A和B之间有一个空格间隔。当A或B为0时输入结束,相应的结果不要输出。
Output
对每个测试用例输出1行,即火星表示法的A+B的值。
Sample Input
1,0 2,1
4,2,0 1,2,0
1 10,6,4,2,1
0 0
Sample Output
1,0,1
1,1,1,0
1,0,0,0,0,0
#include
<
iostream
>
#include
<
vector
>
#include
<
sstream
>
#include
<
string
>
using
namespace
std;
vector
<
int
>
vec,tmp,fir,sec;
bool
IsPrime(
int
n)
...
{
if(n==2)return true;
if(n%2==0)return false;
int i;
for(i=3;i*i<=n;i+=2)
if(n%i==0)return false;
return true;
}
void
change(
string
str)
...
{
istringstream in(str);
tmp.clear();
int a;
char ch;
while(in>>a)
...{
in>>ch;
tmp.push_back(a);
// cout<
}
}
bool
Input()
...
{
string first,second;
cin>>first>>second;
if(first=="0"&&second=="0")return false;
fir.clear();
sec.clear();
tmp.clear();
int len1=first.length(),i;
int len2=second.length();
change(first);
for(i=tmp.size()-1;i>=0;i--)
fir.push_back(tmp[i]);
// for(i=0;i // cout<
change(second);
for(i=tmp.size()-1;i>=0;i--)
sec.push_back(tmp[i]);
len1=fir.size();
len2=sec.size();
if(len1>len2)
for(i=len2;i<len1;i++)
sec.push_back(0);
else
for(i=len1;i<len2;i++)
fir.push_back(0);
}
void
Init()
...
{int i,k=0;
for(i=2;k<=30;i++)
if(IsPrime(i))
...{
k++;
vec.push_back(i);
// cout<
}
}
void
Solve()
...
{
int i;
int len=fir.size();
for(i=0;i<len;i++)
fir[i]+=sec[i];
fir.push_back(0);
for(i=0;i<len;i++)
if(fir[i]>=vec[i])
...{fir[i]%=vec[i];
fir[i+1]++;
}
if(fir[len])
cout<<fir[len]<<",";
for(i=len-1;i>0;i--)
cout<<fir[i]<<",";
cout<<fir[0]<<endl;
}
int
main()
...
{
Init();
while(Input())
Solve();
return 0;
}
第四题:
最大连续子序列
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 545 Accepted Submission(s): 234
Problem Description
给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,
Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个,
例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和
为20。
在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该
子序列的第一个和最后一个元素。
Input
测试输入包含若干测试用例,每个测试用例占2行,第1行给出正整数K( < 10000 ),第2行给出K个整数,中间用空格分隔。当K为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元
素,中间用空格分隔。如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。
Sample Input
6
-2 11 -4 13 -5 -2
10
-10 1 2 3 4 -5 -23 3 7 -21
6
5 -8 3 2 5 0
1
10
3
-1 -5 -2
3
-1 0 -2
0
Sample Output
20 11 13
10 1 4
10 3 5
10 10 10
0 -1 -2
0 0 0
#include
<
iostream
>
#include
<
cstdio
>
using
namespace
std;
int
num[
10005
];
int
flag[
10005
];
int
n;
bool
Input()
...
{
//cin>>n;
scanf("%d",&n);
if(!n)return false;
int i;
for(i=0;i<n;i++)
//cin>>num[i];
scanf("%d",num+i);
return true;
}
void
Solve()
...
{
flag[0]=num[0];
int max=flag[0];
int i,end=0,j,begin,sum=0;
for(i=1;i<n;i++)
...{
if(flag[i-1]>=0)
flag[i]=flag[i-1]+num[i];
else
flag[i]=num[i];
if(flag[i]>max)
...{
max=flag[i];
end=i;
}
}
if(max<0)
...{
cout<<0<<" "<<num[0]<<" "<<num[n-1]<<endl;
return ;
}
else
...{
for(j=end;j>=0;j--)
if((sum+=num[j])==max)
begin=j;
cout<<max<<" "<<num[begin]<<" "<<num[end]<<endl;
}
}
int
main()
...
{
while(Input())
Solve();
return 0;
第五题:
畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 711 Accepted Submission(s): 315
Problem Description
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
Sample Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output
1
0
2
998
#include
<
iostream
>
#include
<
cstdio
>
#include
<
cstring
>
#include
<
vector
>
using
namespace
std;
int
n,m;
vector
<
int
>
road[
1024
];
int
flag[
1024
];
bool
Input()
...
{
scanf("%d",&n);
if(!n)return false;
int i,head,rear,tmp;
for(i=1;i<=n;i++)
road[i].clear();
memset(flag,0,sizeof(flag));
scanf("%d",&m);
for(i=0;i<m;i++)
...{
scanf("%d%d",&head,&rear);
road[head].push_back(rear);
road[rear].push_back(head);
}
return true;
}
void
go(
int
i)
...
{
int len=road[i].size();
int j;
for(j=0;j<len;j++)
...{if(flag[road[i][j]])continue;
flag[road[i][j]]=1;
go(road[i][j]);
}
}
void
Solve()
...
{
int i;
int times=0,j;
for(i=1;i<=n;i++)
...{
if(flag[i])continue;
flag[i]=1;
times++;
int len=road[i].size();
for(j=0;j<len;j++)
...{
if(flag[road[i][j]]) continue;
flag[road[i][j]]=1;
go(road[i][j]);
}
}
cout<<times-1<<endl;
}
int
main()
...
{
while(Input())
Solve();
return 0;
}