Задача: Дана целочисленная матрица [latex][a_{i,j},\ i=1,\ldots,n;\ j=1,\ldots,m][/latex]. Получить [latex]b_{1},\ldots,b_{n}[/latex], где
[latex]{b}_{i}=\sum_{j=1}^{n}(-1)^{i+j}a_{ij}[/latex]
Код на С++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
#include <iostream> #include <stdio.h> using namespace std; int main () { int n, m; cin>>n>>m; //вводим размер матрицы int A[n][m]; //основная матрица int B[n]; //результаты for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { cin>>A[i][j]; } } for (int i=0; i<n; i++){ B[i]=0; //обнуляем элементы массива для подсчёта суммы for (int j=0; j<m; j++){ B[i] += ((i+j)%2==0? 1: -1) * A[i][j]; } } for (int i=0; i<n; i++) cout<<B[i]<<" "; //Результаты на экран return 0; } |
Код на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
import java.util.*; import java.lang.*; import java.io.*; class Count{ public static void main (String[] args) { int n, m; Scanner sc = new Scanner (System.in); n = sc.nextInt(); m = sc.nextInt(); int[][] A = new int [n][m]; int[] B; B = new int [n]; for (int i=0; i<n; i++) { for (int j=0; j<m; j++) { A[i][j] = sc.nextInt(); } } for (int i=0; i<n; i++){ B[i] = 0; for (int j=0; j<m; j++){ B[i] += ((i+j)%2==0? 1: -1) * A[i][j]; } } for (int i=0; i<n; i++) System.out.println (B[i] + " "); } } |
Тесты:
[latex]n*m[/latex] | [latex]\begin{bmatrix}{a}_{ij}\end{bmatrix}[/latex] | [latex]b_{i}[/latex] |
3*3 | 1 2 3
4 5 6 7 8 9 |
2 -5 8 |
1*6 | 2 -4 6 -8 10 -12 | 42 |
3*5 | 1 3 5 7 9
11 13 15 17 19 21 23 25 27 29 |
5 -15 25 |
Алгоритм: Чтобы решить эту задачу, необходимо было создать два массива: входной массив (матрицу) и массив результатов (который надо инициализировать нулями). Далее, необходимо завести цикл, в котором будет проводится, собственно говоря, подсчёт. В зависимости от суммы номеров строки и столбца исходной матрицы, -1 в степени этой суммы будет принимать положительное или отрицательное значение. Соответственно, к результату будет прибавляться или отниматься значение, стоящее на i-том j-том месте.
Для проверки правильности работы программы, воспользуйтесь ссылкой.
Во-первых, для того, чтобы вычислить (-1)^(i+j+2) * A[i][j], не нужно прямо следовать математической записи и использовать функцию pow. Достаточно посмотреть на четность выражения (i+j+2).
Во-вторых, мне кажется более логичным обнулять вектор B не в цикле ввода матрицы A, а в цикле вычисления вектора B. Таким образом у нас будет два логически выделенных цикла: один просто читает матрицу А, а другой просто строит вектор В.
В-третьих, либо в записи условия, либо в решении есть ошибка: B[i] = sum{j=1..n}(A[i][j] * (-1)^n) — в таком виде (-1)^n не зависит от j и может быть вынесена из-под суммы. А Вы вычисляете (-1)^(i+j+2).
Да, это ошибка в условии. Там i+j.
1)Функция была написана раньше, я её скопипастил и вставил. Это заняло меньше времени.
2)Исправил.
— Нужно всё же разобраться с чередованием знаков. (-1) в степени это просто удобное (для математиков) обозначение чередования знаков — «+» для чётных, «—» для нечётных. Так его и нужно вычислять: (i + j) % 2? 1: -1
— Что-то в тестах не так. «1 2 34 5 67 8 9» — это 7 чисел, а нужно 9. Распишите в виде матрицы, тогда станет ясно. С «1 3 5 7 911 13 15 17 1921 23 25 27 29» похожая ситуация. (Это я делаю вид, что не понимаю, что происходит. Но матрицей представить матрицу это как-то естественнее.)
Исправил (сбилось после редактирования).
Зачтено.