おかしなところがあったらごしてきくださいorz

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

おかしなところがあったらごしてきくださいorz

#1

投稿記事 by makaraito » 3年前

コード:

#include <stdio.h>
#include <stdlib.h>

int main(){
    int i;
    int d,n;
    int *a;
    char *rl;
    int sum;
    
    scanf("%d %d",&d,&n);
    a = (int*)calloc(n,sizeof(int));
    rl = (char*)calloc(n,sizeof(char));
    
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    
    sum = a[0];
    rl[0] = 1;
    i = 1;
    
    while(i<n){
        if(rl[i]==0){
            rl[i] = 1;
            sum += a[i];
            if(abs(sum)>d){
                sum -= a[i];
            }else{
                i++;
            }
        }else if(rl[i]==1){
            rl[i] = 2;
            sum -= a[i];
            if(abs(sum)>d){
                sum += a[i];
            }else{
                i++;
            }
        }else{
            rl[i] = 0;
            i--;
        }
        
    }
    
    if(abs(sum)<=d){
        
    }else{
        while(i>0);
    }
    
    for(i=0;i<n;i++){
        if(rl[i]==1) printf("R");
        else if(rl[i]==2)printf("L");
        else while(i>0);
    }
    printf("\n");



    return 0;
}
標準入力からdとnがきて、
n分のaが来て、
そのaを左右に動かすプログラムなんですが、
1週間考えてもわからないのでお力をお貸しくださいorz

2分木を片っ端から探索する感じのコードのつもりです。
出力に無限ループが含まれてるのはエラーチェックです(失敗しても、出力違いかランタイムエラーかしかわからないため)

box
記事: 1760
登録日時: 10年前

Re: おかしなところがあったらごしてきくださいorz

#2

投稿記事 by box » 3年前

makaraito さんが書きました:

コード:

    if(abs(sum)<=d){
        
    }else{
        while(i>0);
    }
ここの無限ループはいいんですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

makaraito

Re: おかしなところがあったらごしてきくださいorz

#3

投稿記事 by makaraito » 3年前

無限ループは大丈夫です!

このコードだとうまく探索できてなさそうな感じのところがあったらおしえてください!orz

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: おかしなところがあったらごしてきくださいorz

#4

投稿記事 by purin52002 » 3年前

こんにちは

いくつか質問があります。
makaraito さんが書きました: n分のaが来て、
そのaを左右に動かすプログラムなんですが、
1週間考えてもわからないのでお力をお貸しくださいorz
何を基準にaを左右に動かすんですか?
makaraito さんが書きました: 2分木を片っ端から探索する感じのコードのつもりです。
二分木はどれですか?

木構造を扱う場合は、再帰処理を使うと結構簡単になると思うのですが、
再帰なんてコストがかかりすぎる!男ならループを使え!
みたいな制約があったり、、、?

日本語力が低い+自称初心者ですので的外れなことを聞いているかもしれませんが、お答えしていただけると嬉しいです^^;

出力がおかしくなりそうな入力についてですが、dを小さく(0とか)aを大きく(100とか)するとおかしくなるような気がします。
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

makaraito

Re: おかしなところがあったらごしてきくださいorz

#5

投稿記事 by makaraito » 3年前

さいきも考えたのですが、今回はなんとなくループにしてみました!
+-dの範囲内で絶対値aを+かーに移動させ続けるかんじです!
sumの値にaの値を足す、引くしていってます
1<=d,n<=1000、1<=a<=2d

の範囲で入力されます!

2分木は+-で別れる感じですね
+から探索していって、だめなら-に、-もだめならrlを0にして一個前に戻る感じです

アバター
purin52002
記事: 235
登録日時: 4年前
連絡を取る:

Re: おかしなところがあったらごしてきくださいorz

#6

投稿記事 by purin52002 » 3年前

入力範囲にも制限があるなら大丈夫な気がします。(プログラム側で制限をかけたほうが安全かも)

というか実際にエラー起こしてから原因を考えるタイプだから、生のソース見てもわからないというのが本音です^p^
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^

makaraito

Re: おかしなところがあったらごしてきくださいorz

#7

投稿記事 by makaraito » 3年前

出力結果が表示されない系の問題なのでほんとわかんない\(^o^)/オワタ

知恵をお貸しいただきましてありがとうございました!
諦めます!!!!orz

返信

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