题目 1、已知一个矩阵,存储在一个二维数组中。将矩阵中和值为最大的那一行元素与首行对换。
#include <iostream>
using namespace std;
/*总体思路是先记再比,再交换,最后输出,
首先我们先要创一个数组记录每一行的和,再
在数组中找到最大的和*/
int main()
{
int sum = 0;
int temp[3] = { 0 };
int a[3] = { 0 };
int mat[3][2] = { 1, 2, 3, 4, 5, 6, };
for (int i = 0; i < 3; ++i)
{
for (int j = 0; j < 2; ++j)
{
sum += mat[i][j];
}
temp[i] = sum;/*存放每一行的和*/
a[i] = i;/*用来标记每一行,(这一步常忽略)*/
}
int x = temp[0], y = 0;
for (int i = 0; i < 3; ++i)/*找到最大行的编号y*/
{
if (temp[i] > x)
{
x = temp[i];
y = i;
}
}
int c = 0;/*两数相互转换的中间转换量*/
for (int i = 0; i < 2; ++i)
{
c = mat[y][i];/*c=a,a=b,b=c*/
mat[y][i] = mat[0][i];
mat[0][i] = c;
}
for (int i = 0; i < 3; ++i)/*数组不可以直接输出,二维数组
采用for循环可输出*/
{
for (int j = 0; j < 2; ++j)
{
cout << mat[i][j]<<"\t";
}
cout << endl;/*输出每一行后才换行*/
}
return 0;
}
题目 2、已知一个方阵,存储在一个二维数组中。用指针访问数组元素的方法,
计算方阵中上三角所有元素的和、下三角所有元素的和,以及主对角线上的所有
元素和。
#include <iostream>
using namespace std;
int a[5][5] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 };
int down = 0;
int up = 0;
int midd = 0;
int(*p)[5] = a;/*设计一个指针指向数组的行数*/
int main() {
for (int i = 0; i < 5; ++i)
{
for (int j = 0; j < 5; ++j)
{
if (i < j)
{
up += *(*(p + i) + j);/* *(*(p+i)+j)=a[i][j] */
}
else if (i > j)
{
down += *(*(p + i) + j);
}
else
{
midd += *(*(p + i) + j);
}
}
}
cout << "上三角的和=" << up << endl;
cout << "下三角的和=" << down << endl;
cout << "主对角线的和=" << midd << endl;
return 0;
}
题目 3、判断字符串是否是“回文”。所谓“回文”是指顺读和逆读都是一样的串,
例如串 12321 和 madam 都是回文。
#include
using namespace std;
const int SZ = 100;
int main()
{
char carray[SZ];
int is_palindrome = 1;
cout << “Please input a string …” << endl;
cin.get(carray, SZ);
int len = strlen(carray);
for (int i = 0; i < len/2; i++)
{
if (carray[i] != carray[len - 1 - i])
{
is_palindrome = 0;
break; } }
if (is_palindrome)
cout << “The string is a palindrome” << endl;
else
cout << “The string is not a palindrome” << endl;
return 0;
}
要求:重新定义回文为:虑去所有非字母字符(包括空格)后,不考虑字母的
大小写,从左向右和从右向左读都相同的词或短语。如“Madam,I’m adam”和
“Golf,No Sir, prefer prison flog!”。改写上面程序,用string来代替字符数组来完
成相同操作。
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
int is_palindrome = 1;
cout << "请输入字符串:" << endl;
cin >> s;
int m = s.size();
getline(cin, s);
for (int i = 0; i <= m / 2; i++)
{
if (s[i] >= 'a' && s[i] <= 'z')
{
s[i] += 32;
}
if (i != m - 1 - i)
{
is_palindrome = 0;
break;
}
}
if (is_palindrome)
cout << "是回文数" << endl;
else
cout << "不是回文数" << endl;
return 0;
}
题目 4、约瑟夫问题:n 个人围成一圈,从 1 开始顺序编号;游戏开始,首先生
成一个 1-n 区间内的随机数,从第一个人开始由 1 到 m 循环报数,报到 m 的人
退出圈外,问最后留下的那个人原来的序号。
提示:本题可以定义一个容器(vector),初始化大小(元素个数)为 n。
容器里元素的值用来标识该人是否出局,1 在圈内,0 出局。值为 0 的元素不参
加报数。此外,vector 容器中的元素是线性排列的,而人是围成圈的,用容器表
示要有一种从容器尾部跳到其头的技巧,即下标加 1 除以 n 求余数。
#include <iostream>
#include <vector>
using namespace std;
template <typename T>
int Joseph(int n,int m)
{
T v;
//vector<int>::iterator t;
for(int i=1;i<=n;i++)
{
v.push_back(i);
}
int start = 0;
//t = v.begin();
while(v.size()!=1)
{
start = (start+m-1)%v.size();
//cout << start << endl;
v.erase(v.begin()+(start));
}
return v[0];
}
int main()
{
int n,m;
cout << "n为,m为";
cin >> n >> m;
int t = Joseph<vector<int>>(n,m);
cout << "留下的人的序号为" << t << endl;
return 0;
}