ツムラ_メモ

大失敗を繰り返す。

スタックオーバーフロー

6行目のa[MAX]の部分をローカル変数で定義すると、案の定スタックオーバーフローだった。
ので、staticで宣言しなおし。
グローバル変数で定義してもよかったけど、どうせ関数ないしなぁ。
提出は来週なので、アルゴリズムを改良しとかねばなぁ。

#include<stdio.h>
#include<stdlib.h>
#define MAX 1299710
int main(void){
	int cnt,cnt2,temp,temp2;
	static int a[MAX];
	for(cnt=0;cnt<MAX;cnt++){
		a[cnt]=0;
	}
	for(cnt=2;(cnt^2)<MAX;cnt++){
		temp=1;
		while(a[cnt]!=0){
			temp++;
			cnt++;
		}	
		a[cnt]=temp;
		for(cnt2=2;(temp2=cnt2*cnt)<MAX;cnt2++){
			a[temp2]=-1;
		}		
	}
	cnt2=0;

 /*
	for(cnt=1;cnt<MAX;cnt++){
		printf("a[%d]=%d\n",cnt,a[cnt]);
		if(a[cnt]>0){
			printf("%dは素数です\n",cnt);
			cnt2++;
		}
	}
	printf("素数は%d個ありました。\n",cnt2);
 */
	
	int k;
	/* 入出力の設定 */
	puts("OutputMode");
	FILE *fpi,*fpo;	//fpi 読み込むファイル fpo 書き込むファイル
	if((fpi=fopen("B.in","r"))==NULL){
		fprintf(stderr,"NO:B.in");
		exit(-1);
	}
	if((fpo=fopen("Result.txt","w"))==NULL){
		fprintf(stderr,"ERROR:CAN'T MAKE OUTPUT FILE");
		exit(-2);
	}
	while(fscanf(fpi,"%d",&k)!=EOF){
		cnt=k;
		//printf("%dを処理します\n",k);
		if(k==0)
			break;
		while(a[cnt]<0){
			cnt++;
		}
		if(k==cnt)
			cnt=0;
		fprintf(fpo,"%d\n",a[cnt]);
	}
	fclose(fpi);
	fclose(fpo);
	return 0;			
}