表計算の問題

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
大学生

表計算の問題

#1

投稿記事 by 大学生 » 10年前

AOJの表計算の問題で詰まっています。できるだけ下のソースを使って完成させたいのですが、横の計算がおかしくなってしまいます。(1)の初期化がうまくいかないせいだと思うのですがいまいちわかりません。どなたか分かる方がいらっしゃいましたら教えてくださいm(_ _)m
できるだけ下のコードを大幅に変更などはしたくないです(>_<)

コード:


//表の行数rと列数c、r × c の要素を持つ表を読み込んで、各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。

#include <stdio.h>

int main(int argc, const char * argv[]) {
    
    int r=0, c=0, x=0;
    int i, j, k, l, m, n;
    
    //input
    scanf("%d %d", &r, &c);
    
    int a[r+1][c+1];
    
    /*初期化*/
    for (i=0; i<r; i++) {
        for (j=0; j<c; j++) {
            a[i][j] = 0;
        }
    }
    /*r×c個分の入力*/
    for (i=0; i<r; i++) {
        for (j=0; j<c; j++) {
            scanf("%d", &x);
            a[i][j] = x;
        }
    }
    
    //output
    /*r×cの横の足し算*/
    for (k=0; k<r; k++) {
        for (l=0; l<c; l++) {
            printf("%d ", a[k][l]);
            a[k][c] = a[k][c] + a[k][l];
        }
        printf("%d ", a[k][c]);
        printf("\n");
        a[k][c] = 0;  //初期化...(1)
    }
    
    /*一番したの縦の足し算*/
    for(m=0; m<=c; m++){  // m<=c にする(1行多いから)
        for(n=0; n<r; n++){
            a[m][c] = a[m][c] + a[n][m];
        }
        printf("%d ", a[m][c]);
    }
    
    return 0;
}

input
4 5
1 1 3 4 5
2 2 2 4 5
3 3 0 1 1
2 3 4 4 6

output
1 1 3 4 5 14 ...(2)
2 2 2 4 5 1801613424 ...(3)
3 3 0 1 1 32775
2 3 4 4 6 19
8 9 9 13 32784 42

(2)の最初は上手く1+1+3+4+5=14とされるのですが次の段(3)からは
2+2+2+4+5=15 とならず1801613424となってしまいます。

box
記事: 2002
登録日時: 15年前

Re: 表計算の問題

#2

投稿記事 by box » 10年前

コード:

/* 表の行数rと列数c、r × c の要素を持つ表を読み込んで、
 * 各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。
 */
#include <stdio.h>

int main(void)
{
    int r, c;
    int i, j, k, l, m, n;

    //input
    scanf("%d%d", &r, &c);
    int a[r+1][c+1];

    for (i = 0; i <= r; i++) {
        for (j = 0; j <= c; j++) {
            a[i][j] = 0;
        }
    }

    /*r×c個分の入力*/
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    /*r×c個分の出力*/
    putchar('\n');
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            printf("%d ", a[i][j]);
        }
        putchar('\n');
    }
    putchar('\n');

    //output
    /*r×cの横の足し算*/
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            a[i][c] += a[i][j];
        }
    }

    /*一番したの縦の足し算*/
    for (j = 0; j < c; j++) {
        for (i = 0; i < r; i++) {
            a[r][j] += a[i][j], a[r][c] += a[i][j];
        }
    }

    for (i = 0; i <= r; i++) {
        for (j = 0; j <= c; j++) {
            printf("%d ", a[i][j]);
        }
        putchar('\n');
    }
    putchar('\n');
    return 0;
}
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

大学生

Re: 表計算の問題

#3

投稿記事 by 大学生 » 10年前

>boxさん
ありがとうございます。大変分かりやすいプログラムでした!
ちなみに 1 ≤ r, c ≤ 100 という条件を一つ付けるとすればどこを返ればよいでしょうか??たくさん要求してすみません。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 表計算の問題

#4

投稿記事 by みけCAT » 10年前

大学生 さんが書きました:ちなみに 1 ≤ r, c ≤ 100 という条件を一つ付けるとすればどこを返ればよいでしょうか??たくさん要求してすみません。
修正前

コード:

    //input
    scanf("%d%d", &r, &c);
    int a[r+1][c+1];
修正後

コード:

    //input
    int a[100+1][100+1];
    scanf("%d%d", &r, &c);
    if (r < 1 || 100 < r || c < 1 || 100 < c) return 1;
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 表計算の問題

#5

投稿記事 by みけCAT » 10年前

オフトピック
box さんが書きました:

コード:

    for (i = 0; i <= r; i++) {
        for (j = 0; j <= c; j++) {
            printf("%d ", a[i][j]);
        }
        putchar('\n');
    }
    putchar('\n');
    return 0;
}
余計な空白や改行が出力されそうだが、大丈夫なのだろうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 表計算の問題

#6

投稿記事 by みけCAT » 10年前

オフトピック
大学生 さんが書きました:表の行数rと列数c、r × c の要素を持つ表を読み込んで、各行と列の合計を挿入した新しい表を出力するプログラムを作成して下さい。
表計算 | プログラミング入門 | Aizu Online Judge
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 15年前

Re: 表計算の問題

#7

投稿記事 by box » 10年前

みけCAT さんが書きました: 余計な空白や改行が出力されそうだが、大丈夫なのだろうか?
AOJの自動判定を通過できなかったら取ればいいだけの話です。
大したことではありません。

# 細かいことを気にしすぎ。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 表計算の問題

#8

投稿記事 by みけCAT » 10年前

box さんが書きました:AOJの自動判定を通過できなかったら取ればいいだけの話です。
大したことではありません。

# 細かいことを気にしすぎ。
数字が違おうが空白の個数が違おうが不正解は不正解で、大会によってはペナルティが加算される。
細かくない。
Codeforcesのジャッジなら空白には甘いかもしれないが、今回はAOJの問題である。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 15年前
住所: 千葉県
連絡を取る:

Re: 表計算の問題

#9

投稿記事 by みけCAT » 10年前

どうせ細かいことを気にするなら、各要素の値の(絶対値の)上限が書かれていないので、
オーバーフローしないようにint型ではなく多倍長計算を用いるべきです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

大学生

Re: 表計算の問題

#10

投稿記事 by 大学生 » 10年前

>boxさん
ありがとうございます!if で return 1; を返す発想が自分にはなかったので大変勉強になりました!

>みけCATさん
AOJでの判断で確かに余分な空白が原因で通りませんでしたが、

コード:


/*出力*/
    for (i = 0; i <= r; i++) {
        for (j = 0; j <= c; j++) {
            printf("%d", a[i][j]);
            if (j != c) {
                putchar(' ');
            }
        }
        putchar('\n');
    }

このように書き換えると通りました!気づかせて下さりありがとうございました!

閉鎖

“C言語何でも質問掲示板” へ戻る