第二次上机作业 (数组综合)

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

#include<iostream>
using namespace std;

void swap(int& a, int& b) { //定义交换函数 
	int c;
	c = a;
	a = b;
	b = c;
}

int main() {

	int arr[3][4] = { {1 , 2 , 3 , 4},{5 , 6 , 7 , 8},{9 , 10 , 11 , 12} };
	int maxx = 0, flag = 0;
	for (int i = 0; i < 3; i++)
	{
		int sum = 0;

		for (int j = 0; j < 4; j++)
		{
			sum += arr[i][j];
		}
		if (sum > maxx) {
			maxx = sum;
			flag = i;//标记元素和为最大值时的行数 
		}
	}
	for (int j = 0; j < 4; j++)
		swap(arr[flag][j], arr[0][j]); //调用交换函数 
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 4; j++)
			cout << arr[i][j] << " ";
		cout << endl;
	}
}

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

#include<iostream>
using namespace std;

int main(){
	int arr[5][5]={
	1,1,1,1,1,
	1,1,1,1,1,
	1,1,1,1,1,
	1,1,1,1,1,
	1,1,1,1,1,};
	
	int sum1 =0,sum2 = 0,sum3 = 0;
	for(int i=0;i<5;i++){
		for(int j=0;j<5;j++)
		if(j>=i){
		sum1 += *(arr[i]+j);//运用指针访问数组 
	}
	}	
		for(int i=0;i<5;i++){
		for(int j=0;j<5;j++)
		if(i>=j){
		sum2 += *(arr[i]+j);
	}
	}	
		for(int i=0;i<5;i++){
		for(int j=0;j<5;j++)
		if(i==j){
		sum3 += *(arr[i]+j);
	}
	}	
	cout<<sum1<<" "<<sum2<<"  "<<sum3<<"  "<<endl; 
}

	

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

#include <iostream>
#include<string> 
using namespace std;
const int SZ = 100;

int main()
{
    string carray;
	string x;
    int flag = 0,m=0;
    cout << "Please input a string .." << endl;
    getline(cin, x);
    int len = x.size();
    while(m<=len-1){
    	if(x[m]>='A'&&x[m]<='Z'||x[m]>='a'&&x[m]<='z'){
    		carray[flag]=x[m];
			flag++; 
		}
		m++;
	}//过滤非字母字符(包括空格) 
    len = flag;
    for (int i = 0; i < len/2; i++)
	{
     if (carray[i] == carray[len - 1 - i]||carray[i]+32==carray[len-1-i]||carray[i]==carray[len-1-i]+32)
	 { int  is_palindrome = 1;
    } 
}

    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<stdlib.h>
#include<time.h>
#include<vector> 
using namespace std;

int main() {
    int n;
    cout<<"请输入人数n:"<<endl;
    cin>>n;
	srand(time(0));
	int m=rand()%n+1;//m为1-n之间的随机数 
	cout<<"生成的boom值m为:"<<m<<endl;
	
	vector<bool>v1(n,1);
	int begin=1,num=n,flag=0,i;
	for( i=0;;i++){
	    if(num==1)break;
		if(i==n)
		{
          i=0;//一次报数循环 
		}
		while(begin==m){
			v1[i]=0;
			begin++;
			num--;
		}
		if(v1[i]!=0){
		    begin++;
			flag=i;	
			num--;
		} 			
    }
      cout<<"最后留下来的那个人原来的序号为:"<<flag+1<<endl;
      return 0;
}
	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值