ゆーすけべー日記

はてなBlogってどーなの!?

死すプロの課題(マリオ3面)クリア!!

渾身の108行、ついにクリア。
俺は所詮のこのこさ。こんな汚いプログラムでもピーチ姫を救ってやる。
/* t00274yw 和田裕介作成                            */
/* 著作権は和田裕介に帰属 無断転用禁止              */
/* システムプログラミング02年4月27日までの宿題      */
/* 素因数分解の表を吐き出し、べき乗表示させるプログラム */
# include 
int i;
int n;
int m;
int x;
int y;
int z;
char prime[1001];
main(){
  /* 初期化,すべての数は素数ということにする */
  for(i=0; i<1001; i++){
    prime[i] = 1;
  }
  
  /*素数は1,素数でないのは0*/
  
  prime[1] = 0;
  for(i=2; i<1001; i++){
    if(prime[i] == 1 ){
      for(n=2; i*n<1001; n++){
	prime[i*n] = 0;
      }
    }
  }
  /* 巾乗の数を記憶する変数がy,一時的に出力した数を記憶していく変数がz  */
  for(i=2; i<1001; i++){
    x = i;
    y = 1;
    z = 0;
    printf("%d = ",i);
    
    for(m=2; m<1001; m++){
      /* Xが素数だったらいきなり表示して抜ける  */      
      if(prime[m] == 1){
	if((x%m == 0) && (x/m==1) ){
	  
	  if(y == 1){
	    if(z != 0){
	      printf("%d x ",z);
	      printf("%d\n",x);
	    }else{
	      printf("%d\n",x);
	    }
	  }else{
	    printf("%d^%d x ",z,y);
	    printf("%d\n",x);
	  }
	  break;
	}
     	if((x%m == 0) && (x/m>1)){
	  /* xがmで割りきれる間  */
	  while(x%m == 0){
	    /* Xが素数になったら */
      	    if (x/m == 1){
	      if(z == m){
		y ++;
	      }else{
		printf("%d^%d x ",z,y);
		y = 1;
	      }
	      
	      
	      if(y == 1){
		printf(" %d\n",m);
		break;
	      }else{
		printf("%d^%d\n",m,y);
		break;
	      }
	    }
	    else{
	      if(z == m){
		y ++;
	      }else if(z == 0){
		z = m;
	      }else{
		if(y != 1){
		  printf("%d^%d x ",z,y);
		}else{
		  printf("%d x ",z);
		}
		y = 1;
		z = m;
	      }
	      x = x/m;
	      continue;
	    } 
	  } 
	}
      }
    }
  }
}