1.矩阵原地转置(10分)
题目内容:
编写程序,将N(N<=10)阶方阵(整型)原地转置(只能使用一个二维数组),例如:
转置前的方阵A
5 6 7 9
2 8 5 4
3 7 16 15
1 4 8 11
转置后的方阵A
5 2 3 1
6 8 7 4
7 5 16 8
9 4 15 11
注意:转置要使矩阵本身作转置运算,而不仅是在屏幕显示转置效果。
输入格式:
N+1行,第1行:数字N(10>=n>0);第2-(N+1)行:N阶方阵的元素
输出格式:
N行,转置后的矩阵。每行数据间用一个空格隔开,末尾无空格。
输入样例:
4
5 6 7 9
2 8 5 4
3 7 16 15
1 4 8 11
输出样例:
5 2 3 1
6 8 7 4
7 5 16 8
9 4 15 11
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
void transpose(int a[][10], int n);
int main()
{
int a[10][10];
int n;
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
cin>>a[i][j];
transpose(a,n);
for(int i=0; i<n; i++)
{
cout<<a[i][0];
for(int j=1; j<n; j++)
cout<<" "<<a[i][j];
cout<<endl;
}
return 0;
}
//转置就是交换a[i][j]与a[j][i],注意循环的条件
void transpose(int a[][10], int n)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<i; j++)
{
int temp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = temp;
}
}
}
2.判断对称矩阵(10分)
题目内容:
判断一个N阶整型矩阵是否为对称矩阵。要求矩阵用一维数组存储。
输入格式:
N+1行,第1行:数字N(10>n>0);第2-(N+1)行:N阶方阵的元素
输出格式:
“Yes”或“No”
输入样例:
4
5 6 7 9
2 8 5 4
3 7 16 15
1 4 8 11
输出样例:
No
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
bool isSymMat(int a[][10], int n);//二维数组的列数要预先确定
int main()
{
int a[10][10];
int n;
cin>>n;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
cin>>a[i][j];
}
if(isSymMat(a,n))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}
bool isSymMat(int a[][10], int n)//和上道题相似,这是判断是否相等
{
bool sign = true;
for(int i=0; i<n; i++)
{
for(int j=0; j<i; j++)
{
if(a[i][j]!=a[j][i])
{
sign = false;
break;
}
}
}
return sign;
}
3.去掉字符串末尾的空格(10分)
题目内容:
编写程序,去掉字符串末尾的空格符。要求字符串用字符数组存放,不使用库函数。结果要显示原字符串和删除末尾空格后的字符串。字符串长度不超过100.
输入格式:
一个字符串
输出格式:
两行:第一行,原字符串;第二行,删除末尾空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。
输入样例:
strd sdf
输出样例:
|strd sdf |
|strd sdf|
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
void delSpace(char str[]);
int main()
{
char s[110];
cin.getline(s,100);
cout<<"|"<<s<<"|"<<endl;
delSpace(s);
cout<<"|"<<s<<"|"<<endl;
return 0;
}
void delSpace(char str[])//去除末尾的空格可以直接把字符的后面变成'\0'
{
char *p = str;
while(*p++);
p = p-2; //找到字符串末尾
while(*p==' ')//把末尾的空格变成'\0'
{
*p = '\0';//可以把这句去掉,在循环外写*(p+1)=0;
p--;
}
}
4.去掉字符串开头的空格符(10分)
题目内容:
编写程序,去掉字符串开头的空格符。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.
输入格式:
一个字符串
输出格式:
两行:第一行,原字符串;第二行,删除开头空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。参照样例。
输入样例:
strd sdf
输出样例:
| strd sdf|
|strd sdf|
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
void delSpace(char str[]);
int main()
{
char s[110];
cin.getline(s,110);
cout<<"|"<<s<<"|"<<endl;
delSpace(s);
cout<<"|"<<s<<"|"<<endl;
return 0;
}
void delSpace(char str[])//采取的是将字符串整体前移消去空格
{
char *p = str, *q = str;
while(*p==' ')
p++; //找到开头不是空格的字符
while(*p) //前移
{
*q = *p;
p++;
q++;
}
*q = 0;
}
5.去掉字符串中间的所有空格(10分)
题目内容:
编写程序,去掉字符串中间的所有空格(保持两头的空格)。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.
输入格式:一个字符串
输出格式:两行:第一行,原字符串;第二行,删除中间空格后的字符串。注意,将原字符串和删除空格后的字符串均放到‘|’’|’中。参照样例。
输入样例:
strd sdf
输出样例:
|strd sdf|
|strdsdf|
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
void delSpace(char str[]);
void movForward(char *p,char *q);
int main()
{
char s[110];
cin.getline(s,110);
cout<<"|"<<s<<"|"<<endl;
delSpace(s);
cout<<"|"<<s<<"|"<<endl;
return 0;
}
void delSpace(char str[])//思路:每读到一个空格,把空格后面所有东西前移
{
char *p = str;
char *q = str;
while(*p==' ')
p++;
//保留开头的空格
do
{
while(*p!=' '&&*p!=0)//找到不是空格的元素,要防止p==0
p++;
q = p; //q和p指向相同的位置
while(*q==' ')//用q找到所有空格之后的元素
q++;
if(*q!=0)//如果不是字符串结尾,就把q后面整体移到p那里
//这可以保护字符串末尾的空格
movForward(p,q);
}while(*p!=' '&&*p!=0);//当还没有把所有空格消完就继续循环
}
void movForward(char *p,char *q)
{
while(*q)
{
*p = *q;
*q = ' ';
q++;
p++;
}
*p = '\0';//移到前面后要把字符串末尾变成0
}
//可以用一个新的字符数组, 通过复制,把空格省略
6.查找子串(10分)
题目内容:
编写程序,在字符串中查找子字符串,找到则返回第一个字符所在的位置(从1开始),找不到则显示“没有该子串”。要求字符串用字符数组存放,不使用库函数。字符串长度不超过100.
输入格式:
两行:第一行为待查找的字符串;第二行为要查找的子字符串。
输出格式:
第一个字符所在的位置(从1开始),若找不到则显示“没有该子串”。
输入样例1:
This is a book!
is
输出样例1:
3
输入样例2:
This is a book!
isa
输出样例2:
没有该子串
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
int findStr(char str[], char dest[]);
bool isEqual(char *p, char *q);
int main()
{
char str[100];
char dest[100];
cin.getline(str,100);
cin.getline(dest,100);
int idx = findStr(str,dest);
if(idx==-1)
cout<<"没有该子串"<<endl;
else
cout<<idx+1<<endl;
return 0;
}
int findStr(char str[], char dest[])//枚举,复杂度比较高
{
char *p = str;
char *q = dest;
int ret = -1;
while(*p!=0)
{
if(isEqual(p,q))
{
ret = p-str;
break;
}
p++;
}
return ret;
}
bool isEqual(char *p, char *q)//判断序列是否相同
{
bool sign = true;
while(*q!=0)
{
if(*p!=*q)
{
sign = false;
break;
}
p++;
q++;
}
return sign;
}
7.排序(10分)
题目内容:
输入n个整数,对它们进行排序,从大到小输出。0<n<=100。注意,不应使用别人写的库函数。
输入格式:
两行,第1行为元素个数n;第2行为n个整数,用空格隔开。
输出格式:
n个排好序的整数,从大到小用一个空格隔开,末尾无空格。
输入样例:
5
1 2 5 4 3
输出样例:
5 4 3 2 1
时间限制:500ms内存限制:32000kb
#include <iostream>
using namespace std;
void swap(int &a, int &b);
void quickSort(int a[], int left, int right);
int main()
{
int a[100];
int n;
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
quickSort(a,0,n-1);
cout<<a[0];
for(int i=1; i<n; i++)
cout<<" "<<a[i];
cout<<endl;
return 0;
}
void swap(int &a, int &b)
{
int temp = a;
a = b;
b = temp;
}
void quickSort(int a[], int left, int right)//快速排序
{
int i = left, j = right;
int pivot = a[(i+j)/2];
while(i<=j)
{
while(a[i]>pivot) i++;//找到左边比基准值小的元素
while(a[j]<pivot) j--;//找到右边比基准值大的元素
if(i<=j) //如果位于基准值两边时就交换
{
swap(a[i], a[j]);
i++;
j--;
}
}
if(j>left) quickSort(a,left,j);//对左边递归进行
if(i<right) quickSort(a,i,right);//对右边递归进行
}
8.二分查找(10分)
题目内容:
从小到大输入若干整数(不超过300),以-99999为结束符,然后再输入一个整数x,z在前面的整数中用二分查找法查找x,若找到,显示数的下标(即从0开始的序号);若找不到,显示-1。注意,不应使用别人写的库函数。
输入格式:
若干整数。
输出格式:
一个下标
输入样例:
1 2 3 4 5 -99999
2
输出样例:
1
时间限制:200ms内存限制:32000kb
#include <iostream>
using namespace std;
int binarySearch(int a[], int left, int right, int dest);
int main()
{
int a[310];
int i=0;
int num;
while(cin>>num&&num!=-99999)
a[i++] = num;
int dest;
cin>>dest;
int idx = binarySearch(a,0,i-1,dest);
cout<<idx<<endl;
return 0;
}
int binarySearch(int a[], int left, int right, int dest)
{
while(left<=right)//只要数组还没空
{
int midIdx = (left+right)/2;//就取中间值比较
int mid = a[midIdx];
if(dest>mid) //中间值小了,说明目标数在右边,就把左端右移
left = midIdx+1;
else if(dest<mid)//中间值大了,说明目标数在左边,就把右端左移
right = midIdx-1;
else
return midIdx;//找到后就返回
}
return -1;
}
//二分查找必须是有序序列