※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

「オイラープロジェクト41~50」の編集履歴(バックアップ)一覧に戻る

オイラープロジェクト41~50 - (2012/08/26 (日) 16:46:29) の1つ前との変更点

追加された行は青色になります

削除された行は赤色になります。

+*問い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;
  }