2020-12-25,19c2oc第三次上机

题目 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值