「オイラープロジェクト41~50」の編集履歴(バックアップ)一覧に戻る
オイラープロジェクト41~50」を以下のとおり復元します。
*問い42
三角語と呼ばれる単語がテキストファイルの中にいくつあるか数える問題。
最大値の見極めがつかないので少しメモリをぜいたくに使って後は愚直に一つずつ計算。
まあ計算すればいいわけだけどファイルは中身が見えないブラックなファイルとして扱いたいし、練習問題でコードサイズは膨らましたくないのでこのコードに落ち着いた感じ。




 #include <stdio.h>
 #include <string.h>
  #include <map>
 int main(){
 	FILE *fp;
 	if((fp=fopen("words.txt","r"))==NULL){
 		printf("fileOpenError");
 		exit(EXIT_FAILURE);
 	}
 	char text[102];
 	int max=0;
 	std::map<int,int> memo;
 	while(fscanf(fp,"\"%[^\"]\",",text)>0){
 		int sum=0;
 		for(int i=0;i<strlen(text);i++){
 			sum+=text[i]-'A'+1;
 		}
		//printf("(%s %d %d)",text,sum,max);
 		if(max<sum)max=sum;
 		if(memo.find(sum)!=memo.end()){
 			memo[sum]++;
 		}else{
 			memo[sum]=1;
 		}
 	}
 	fclose(fp);
	int t=0,ans=0; 
 	for(int i=1;t<=max;i++){
 		t=((i+1)*i)/2;
 		ans+=memo.find(t)!=memo.end()?memo[t]:0;
 	} 
 	printf("%d\n",ans);
 }




*問い48
Σi^i(i=1...1000)の下10ケタを求めよという問題。


 int main(){
	__int64 ans=0,b,m=10000000000;
	for(int i=1;i<1001;i++){
		b=1;
		for(int j=0;j<i;j++){
			b=(b*i)%m;//ここは工夫して計算量を落としてもいいんだけどたった100万回だしまあいいか
		}
		ans=(ans+b)%m;
	}
	std::cout<<ans;
 }

復元してよろしいですか?