北理西交计算机夏令营机试题
Posted 玛丽莲茼蒿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了北理西交计算机夏令营机试题相关的知识,希望对你有一定的参考价值。
一、北理
1.1 题目描述
给定任意个整数,以逗号隔开,输出最后一个重复数字,没有重复数字输出-1
输入:
1,2,3,4,4,3,2,1
1,2,3,4,5,6,7,8
输出
1
-1
首先得会怎样实现输入,用scanf实现对任意个整数的输入时,只要用非整数作为间隔就行(无论你是逗号,还是空格)
# include<bits/stdc++.h>
using namespace std;
int main()
int a[100];
int i=0;
char y;
do
scanf("%d",&a[i]);
i++;
while((y=getchar())!='\\n'); //注意getchar函数有返回值
for(int j=0;j<i;j++) //注意只有a[0]~a[i-1]里有东西
printf("%d,",a[j]);
return 0;
看到有人是将输入定义为字符串类型,然后再进行字符串的分割,费呢老大劲。
解答:
# include<bits/stdc++.h>
using namespace std;
int main()
int temp;
int a[100];
int i=0;
int rep=-1;
char y;
bool exis=false; //是否已经输入过了
do
scanf("%d",&temp);
for(int j=0;j<=i-1;j++)
if(a[j]==temp) //有重复
rep=temp;
exis=true;
if(exis==false) //没有重复
a[i]=temp;
i++;
while((y=getchar())!='\\n');
if(rep==-1)
printf("-1" );
else
printf("%d",rep);
return 0;
1.2题目描述
描述:一次shift操作就是把一个单词的第一个挪到最后,单词有n位就最多挪n次,问可以和原单词相同几次。
如输入:byebye 输出:2
输入:abcd 输出:1
这次输入不要用上面的方法了。因为输入的是char,getchar接收的也是char,一来二去就乱套了。不要用下面这种方法!!
char a[100];
int i=0;
char y;
do
scanf("%c",&a[i]); //错误!!
i++;
while((y=getchar())!='\\n');
思路:
将输入的string变量转化为char *。然后进行移位操作。
下面是个错误的代码。经过添加输出语句,发现temp指向的值居然和a一起变化,齐了个大怪!
原来是因为通过(char *)s.data()操作,直接把地址给a和temp了,也就是说a和temp指向了同一个地方。
# include<bits/stdc++.h>
using namespace std;
int shift(string s,int size)
char *a=(char *)s.data();
char *temp=(char *)s.data();//拷贝一个比较的时候用
int count=0;
for(int i=1;i<=size;i++) //有多少个移位多少次
char t=a[0];
for(int j=1;j<=size-1;j++) //除了第一个,整体向前一位
a[j-1]=a[j];
a[size-1]=t;
cout<<a<<endl; //!!!!!!!!!一样
cout<<temp<<endl; //!!!!!!!一样
if(strcmp(temp,a)==0)
count++;
return count;
int main()
string s;
cin>>s;
int size=s.length();
int result=shift(s,size);
printf("%d",result);
return 0;
为了避免以上问题,我们得换一个string向char数组转换的方法。于是找到了这个方法,利用c_str()函数!
string s="hello";
char a[20];
strcpy(a,s.c_str());//!!!!
解答:
# include<bits/stdc++.h>
using namespace std;
int shift(string s,int size)
char a[20];
char temp[20];
strcpy(a,s.c_str());
strcpy(temp,s.c_str());
// char *a=(char *)s.data();
// char *temp=(char *)s.data();//拷贝一个比较的时候用
int count=0;
for(int i=1;i<=size;i++) //有多少个移位多少次
char t=a[0];
for(int j=1;j<=size-1;j++) //除了第一个,整体向前一位
a[j-1]=a[j];
a[size-1]=t;
// cout<<a<<endl;
// cout<<temp<<endl;
if(strcmp(temp,a)==0)
count++;
return count;
int main()
string s;
cin>>s;
int size=s.length();
int result=shift(s,size);
printf("%d",result);
return 0;
突然想到另一个方法,用substr(从哪开始截,截几个)函数试一下。不行!因为substr返回的还是string类型。
二、西安交通大学
2.1 矩阵加法
首先学一下矩阵的输入,矩阵每一行的输入就是简单的scanf函数就可以
# include<bits/stdc++.h>
using namespace std;
int main()
int n,m;
scanf("%d%d",&n,&m); //n行m列
int num1[n][m];
int num2[n][m];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&num1[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&num2[i][j]);
return 0;
千万不要用这种傻逼的自创的矩阵输入,会报出runtime error。并且注意下面这种do-while的输入适用的情况是不知道输入整数的个数时。
for(int i=0;i<n;i++)
int k=0;
char y;
do
scanf("%d",&num1[i][k]);
k++
while((y=getchar())!='\\n');
正解:
# include<bits/stdc++.h>
using namespace std;
int main()
int n,m;
scanf("%d%d",&n,&m); //n行m列
int num1[n][m];
int num2[n][m];
int sum[n][m];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&num1[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&num2[i][j]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
sum[i][j]=num1[i][j]+num2[i][j];
cout<<sum[i][j]<<' ';
cout<<endl;
return 0;
以上是关于北理西交计算机夏令营机试题的主要内容,如果未能解决你的问题,请参考以下文章