C언어 배열 문제 풀이1

성민개발로그·2021년 6월 22일
0

C언어

목록 보기
1/9
post-thumbnail

배열 문제 4번

矩阵元素的运算

读入 1 个正整数 n(1≤n≤10), 再读入 n*n 阶方阵 a , 计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。(副对角线为从矩阵的右上角至左下角的连线)
例:括号内是说明,可以不输入、不输出。
输入: 4 (n=4)
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出:sum=35

답:

#include<stdio.h>

int main()
{
	int n;
	int answer=0;
	scanf_s("%d", &n);
	int a[10][10] = { 0 };
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
        // 1 2 3 4 식으로 입력해도 배열에 들어가진다.
			scanf_s("%d", &a[i][j]); 
		}
	}
    // 끝 열이랑 끝 행은 계산 안함으로 n-1 선언
	for (int i = 0; i < n-1; i++) {
		for (int j = 0; j < n-1; j++) {
			if (i == 0) {
				answer += a[i][j];
			}
			else {
            // 대각선 숫자도 계산에 포함이 안되기 때문에 if문으로 구분.
				if (j != n - i-1) {
					answer += a[i][j];
				}
			}
		}
	}
	printf("%d",answer);
	return 0;
}

문제 5번

加法口诀表

要求使用二维数组求解下列问题。(提示:将加数、被加数、和放入一个二维数组中, 再输出该数组)。输入 1 个正整数 n(1≤n≤10),输出一张 20 以内的加法口诀表. 要求,该口诀表中的加数与被加数都不大于n, 分别存放在该表格中的第一行和第一列. 样式例如下:括号内是说明
输入:6 (n=6)
输出:
"+" 1 2 3 4 5 6
1 2
2 3 4
3 4 5 6
4 5 6 7 8
5 6 7 8 9 10
6 7 8 9 10 11 12

#include<stdio.h>
#include <math.h>

int main()
{
	int n;
    //문제에서 2차배열로 선언하라고 했기때문에 2차배열로 선언
	int a[10][10];
	scanf_s("%d", &n);
	printf("+ ");
	for (int i = 0; i < n; i++) {
		printf("%d ", i + 1);
	}
	printf("\n");
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < i+1; j++) {
			a[i][j] = (i + 1) + (j + 1);
		}
	}
	for (int i = 0; i < n; i++) {
		printf("%d ", i + 1);
		for (int j = 0; j < i+1; j++) {
			printf("%d ", a[i][j]);
		}
		printf("\n");
	}
	return 0;
} 

문제 6번

矩阵排序

编制程序,实现如下功能:
(1) 该程序首先从键盘输入整数矩阵a的行数m与列数n,根据输入的m与n,依次输入矩阵a的各元素值。假设1≤m,n≤20
(2) 能够计算矩阵a的魅力指数矩阵b,对于矩阵a的每一个元素 ,定义它的“魅力指数” ,即它的上、下、左、右四个邻居之和,如果某个位置不存在邻居,则该位置不参与求和计算。例如,输入的矩阵a如下图左边的矩阵所示,其对应的“魅力指数”矩阵如下图中间所示。

(3) 依据矩阵b 中对应的“魅力指数”大小,对矩阵a的所有元素进行排序。排序规则为,按“魅力指数”从左到右,从上到下的顺序降序排列,新得到的排序后的矩阵c如上图右侧矩阵所示。
(4) 依次输出上述三个矩阵的内容。

#include<stdio.h>
//퀵 정렬 사용해서 b매트릭스 정렬한다 
void quickSort(int* arr, int start, int end) {
	if (start >=end)return;//원소가 한개인 경우 취소
	int pivot = start;//첫번째 원소
	int left = start + 1;
	int right = end;//끝 원소
	while (left <= right) {
    // 피벗보다 작은 데이터 찾을때까지 left증가
		while(left <= end && arr[left] > arr[pivot])left++;
	// 피벗보다 큰 데이터 찾을때까지 right감소
        while(right > start && arr[right] < arr[pivot])right--;
    // left가 right보다 크다면 피벗 위치 교환
		if (left > right) {
			int temp = 0;
			temp = arr[pivot];
			arr[pivot] = arr[right];
			arr[right] = temp;

		}
     // 위 조건이 아니면 둘 위치 교환
		else {
			int temp = 0;
			temp= arr[left];
			arr[left] = arr[right];
			arr[right] = temp;
		}

	}
    // 다시 분할해서 양쪽으로 실행 (재귀)
	quickSort(arr, start, right - 1);
	quickSort(arr, right+1, end);
}


int main()
{
	int m, n,temp,k=0;
	int a[20][20];
	int b[20][20];
	int c[20][20];
	int arr1[400], arr2[400], arr3[400] = { 0 };
	scanf_s("%d %d", &m, &n);
    // a매트릭스 입력
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			scanf_s("%d", &a[i][j]);
		}
	}
	// b 매트릭스 생성 및 arr1 arr2 값 대입 초기화
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			temp = 0;
			if (j + 1 < n)temp += a[i][j + 1];
			if (j - 1 >= 0)temp += a[i][j - 1];
			if (i + 1 < m)temp += a[i + 1][j];
			if (i - 1 >= 0)temp += a[i - 1][j];
			b[i][j] = temp;
			arr1[k] = temp;
			arr2[k] = temp;
			k++;
		}
	}
	// 퀵 정렬 실행
	quickSort(arr1, 0, m*n-1);
	int p,t;
    // c 매트릭스 실행
	for (int i = 0; i < m * n ; i++) {
		for (int j = 0; j < m * n; j++) {
			if (arr3[j] != 1 && arr1[i] == arr2[j]) {
				arr3[j] = 1;
				p = j % n;
				t = j / n;
				c[i / n][i % n] = a[t][p];
			}
		}
	}
    
    
    // a,b,c매트릭스 순차적으로 출력
	printf("a=\n");
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (a[i][j] < 10) {
				printf("%d  ", a[i][j]);
			}
			else {
				printf("%d ", a[i][j]);
			}
		}
		printf("\n");
	}
	printf("b=\n");
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (b[i][j] < 10) {
				printf("%d  ", b[i][j]);
			}
			else {
				printf("%d ", b[i][j]);
			}
		}
		printf("\n");

	}	
	printf("c=\n");
	for (int i = 0; i < m; i++) {
		for (int j = 0; j < n; j++) {
			if (c[i][j] < 10) {
				printf("%d  ", c[i][j]);
			}
			else {
				printf("%d ", c[i][j]);
			}
		}
		printf("\n");
	}
	

	return 0;
}

0개의 댓글