寝癖頭の解法

学習中の覚え書きを投稿、更新していきます。

C言語による構造化プログラミング

C言語による構造化プログラミングです。
与えられたC++言語のプログラムを、goto 文を使わないで実装するプログラムです。

・問題
 goto 文は、C/C++言語などで使うことのできる文で、実行されると無条件に指定されたラベルに処理が飛びます。
 例えば goto CHECK_NUM; という文が実行されると、プログラムの中で CHECK_NUM: と書かれた行に処理が移ります。
 この機能を使って、繰り返し処理なども実現することができます。
 一方、goto 文は自由度が高すぎ、プログラムの可読性に影響するため、可能な限り使わないことが推奨されています。
 次のC++言語のプログラムと同じ動作をするプログラムを作成してください。
 ただし、goto 文は使わないで実装してみましょう。

void call(int n){
  int i = 1;
 CHECK_NUM:
  int x = i;
  if ( x % 3 == 0 ){
    cout << " " << i;
    goto END_CHECK_NUM;
  }
 INCLUDE3:
  if ( x % 10 == 3 ){
    cout << " " << i;
    goto END_CHECK_NUM;
  }
  x /= 10;
  if ( x ) goto INCLUDE3;
 END_CHECK_NUM:
  if ( ++i <= n ) goto CHECK_NUM;

  cout << endl;
}

・入力される値
 1つの整数 n が1行に与えられます。

・期待する出力
 上記プログラムに入力の整数 n を与えた結果を出力してください。

・条件
   3≤n≤10000

僕が作成、提出したコードは、以下のとおりです。

/*
 ITP1_5_D : Structured Programming
 http://judge.u-aizu.ac.jp/
 C言語による構造化プログラミング
 https://neguse-atama.hatenablog.com
*/
#include<stdio.h>
int main(void){
    int n,i,a;
    scanf("%d",&n);
    for(i=1;i<=n;i++){
        a=i;
        if((a%3)==0){
            printf(" %d",i);
        }else{
            for(;a;){
                if((a%10)==3){
                    printf(" %d",i);
                    a=0;
                }
                a=a/10;
            }
        }
    }
    putchar('\n');
    return 0;
}

設問の出典は、プログラミング問題のオンライン採点システム「Aizu Online Judge(AOJ)」です。
http://judge.u-aizu.ac.jp/onlinejudge/
ITP1_5_D : Structured Programming