第二次上机

题目 1、已知一个矩阵,存储在一个二维数组中。将矩阵中和值为最大的那一行
元素与首行对换。

利用数组进行操作

#include <iostream>
#include<vector>
using namespace std;
int main()
{
	int n=4,k=4;
	int a[4][4] = {};//一个4*4的矩阵
	cout << "请输入:";
	vector<int>s(n);//存储和
    int m;//和值最大的行
		for (int i = 0; i < 4; i++)
		{
			int sum = 0;

			for (int j = 0; j < 4; j++)
			{		
				cin >> a[i][j];
				sum += a[i][j];
			}
			s[i] = sum;

		}
		int max = s[0];
		for (int i = 0; i < 4; i++)
		{
			if (s[i] >= max) 
			{
				max = s[i];
				m = i;
			}
		}
		for (int i = 0; i < 4; i++)
		{
			if (i == 0)
			{
				for (int j = 0; j < 4; j++)
				{
					cout << a[m][j] << " ";
				}
				cout << endl;
			}
			if (i == m)
			{
				for (int j = 0; j < 4; j++)
				{
					cout << a[0][j] << " ";
				}
				cout << endl;
			}
			if (i != 0 && i != m)
			{
				for (int j = 0; j < 4; j++)
				{
					cout << a[i][j] << " ";
				}
				cout << endl;
			}
		}
		return 0;
}

利用容器进行操作

#include <iostream>
#include <vector>
using namespace std;
int main() {
	int r, c, m, s;
	cout << "请输入行数和列数:" << ends;
	cin >> r >> c;
	vector <int>v1(r);
	vector <int>v2(c);
	vector<vector <int>>v3(r, v2);
	for (int i = 0; i < r; ++i)
	{
		for (int j = 0; j < c; j++)
		{
			int sum = 0;
			cin >> m;
			v3[i][j] = m;
			sum += m;
		}
	}
	for (int i = 0; i < r; i++)
	{
		int max;
		max = v1[0];
		if (v1[i] >= max)
		{
			max = v1[i];
			s = i;
		}
	}
	vector<int> o(c);
	for (int i = 0; i < c; i++)
	{
		o[i] = v3[0][i];
		v3[0][i] = v3[s][i];
		v3[s][i] = o[i];
	}
	for (int i = 0; i < r; i++)
	{
		for (int j = 0; j < c; j++)
		{ 
			cout << v3[i][j];
		}
		cout << endl;
	}
	return 0;
}

题目 2、已知一个方阵,存储在一个二维数组中。用指针访问数组元素的方法,
计算方阵中上三角所有元素的和、下三角所有元素的和,以及主对角线上的所有
元素和。

#include <iostream>
using namespace std;
int main()
{
	int a[4][4];
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cin >> a[i][j];
		}
	}
	int fs, fx, dj;//所求三个和
	int(*p)[4] = a;
	fs = *p[0] + *(p[0] + 1) + *(p[0] + 2) + *(p[0] + 3) + *p[1] + *(p[1] + 1) + *(p[1] + 2) + *p[2] + *(p[2] + 1) + *p[3];
	fx = *p[0]  + *p[1]  + *(p[1] + 1) + *p[2] + *(p[2] + 1) + *(p[2] +2 ) + *p[3]  + *(p[3] + 1) + *(p[3] + 2) + *(p[3+]+3);
	dj = *p[0] + *(p[0] + 3) + *(p[1] + 1) + *(p[1] + 2) + *(p[2] + 1) + *(p[2] + 2) + *p[3] + *(p[3] + 3);
	cout <<"上三角所有元素的和"<< fs << endl <<"下三角所有元素的和"<< fx << endl <<"主对角线上的所有
元素和"<< dj;
	return 0;
}

利用容器

#include <iostream>
#include <vector>
using namespace std;
int main() {
	int r, n, i, m, sum1, sum2, sum3, sum4 = 0;
	cout << "请输入行列数:";
	cin >> r;
	vector <int>v1(r);
	vector <vector <int>>v2(r, v1);
	for (n = 0; n < r; ++n)
	{
		for (i = 0; i < r; ++i)
		{

			cin >> m;
			v2[n][i] = m;
			sum4 += v2[n][i];

		}
	}
	sum1 = 0;
	for (n = 0, m = 0; n < r && m < r; ++n, ++m)
	{
		for (i = r - 1; i >= n; --i)
		{
			sum1 += v2[m][i];
		}

	}
	for (i = 0, sum3 = 0; i < r; ++i)
	{
		sum3 += v2[i][i];
	}
	sum2 = sum4 - sum1 + sum3;
	cout << "上三角和:" << sum1 << endl;
	cout << "下三角和:" << sum2 << endl;
	cout << "主对角线和:" << sum3 << endl;
	return 0;
}

题目 3、判断字符串是否是“回文”。所谓“回文”是指顺读和逆读都是一样的串,
例如串 12321 和 madam 都是回文。

要求:重新定义回文为:虑去所有非字母字符(包括空格)后,不考虑字母的
大小写,从左向右和从右向左读都相同的词或短语。如“Madam,I’m adam”和
“Golf,No Sir, prefer prison flog!”。改写上面程序,用string来代替字符数组来完
成相同操作。


#include <iostream>
#include <string>
using namespace std;
int main()
{
	string carray;
	string c1;
	cout << "Please input a string .." << endl;
	int is_palindrome = 1;
	getline(cin, carray);
	int len1 = carray.size();
	for (int i = 0; i < len1; ++i)
	{
		if ((carray[i] <=122) && (carray[i] >=97))
		{
			carray[i] -= 32;
			c1 += carray[i];
		}
		else if((carray[i] <= 90) && (carray[i] >= 65))
		{
			c1 += carray[i];
		}
	}
	int len = c1.size();
	for (int i = 0; i < len / 2; i++)
	{
		if (c1[i] != c1[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;
}

题目 4、约瑟夫问题:n 个人围成一圈,从 1 开始顺序编号;游戏开始,首先生
成一个 1-n 区间内的随机数,从第一个人开始由 1 到 m 循环报数,报到 m 的人
退出圈外,问最后留下的那个人原来的序号。
提示:本题可以定义一个容器(vector),初始化大小(元素个数)为 n。
容器里元素的值用来标识该人是否出局,1 在圈内,0 出局。值为 0 的元素不参
加报数。此外,vector 容器中的元素是线性排列的,而人是围成圈的,用容器表
示要有一种从容器尾部跳到其头的技巧,即下标加 1 除以 n 求余数。

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n, m,i=0,a,b,c;
	cout << "输入n和m:";
	cin >> n >> m;
	vector<bool>vi(n,1);
    
	if (n <= 0) 
	{
		cout << "n应大于0";
	}
	for (a = 0; a < n - 1; ++a)
	{
		for (b = 1; b < m; ++i)
		{
			if (i >= n)
			{
				i = i % n;
			}
			if (vi[i] == 1)
			{
				++b;
			}
		}
		if (i >= n)
		{
			i = i % n;
		}
		while (vi[i] == 0)
		{
			++i;
			if (i >= n)
			{
				i = i % n;
			}
		}
		if (vi[i] == 1)
		{
			vi[i] = 0;
		}
	}
	for (c = 0; c < n; ++c)
	{
		if (vi[c] == 1)
		{
			cout << c + 1 << endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值