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

オイラープロジェクト91~100 - (2012/08/28 (火) 15:04:21) のソース

*問い92
各桁の2乗を足し合わせた数を求め、それを繰りかすと必ず1か89に到達する。
1000万以下で89に到達する数の個数を求めよ。


 #include<stdio.h>
 int memo[1000]={0};
 int saiki(int n){
	if(n==1||n==89){
		return n;
	}
	if(n<1000&&memo[n]!=0)return memo[n];
	int next=0,m=n;
	while(m!=0){
		next+=(m%10)*(m%10);
		m/=10;
	}
	m=saiki(next);
	if(n<1000)memo[n]=m;
	return m;
 }
 int main(){
	int ans=0;
	for(int i=1;i<10000000;i++){
		ans+=(saiki(i)==89);
	}
	printf("%d",ans);
 }



*問い97
28433×2^7830457+1は素数でありこれの下10ケタを答えよという問題。
Lispは苦手だけどLispでなかったらこんなに簡潔には書けない気もする。
Lisp様様って感じ(俺がヘボいだけかな)



 (defvar mask 10000000000)
 mask
 (setq mask 10000000000)
 10000000000
 (defun saiki (n m all)
   (if (< 0 m)
       (if (= (mod m 2) 1) 
 	  (saiki (mod (* n n) mask) (floor (/ m 2)) (mod (* all n) mask))
 	(saiki (mod (* n n) mask) (floor (/ m 2)) all))
     all))
 saiki
 (mod (+ (* (saiki 2 7830457 1)  28433) 1) mask)





*問い99
数万^数万乗形式の大きな数が1000行与えられるので一番大きな数字の書かれた行を探せという問題。
対数を使って計算すれば楽勝。
楽勝なんだけど、このコードで合格出来たけど一応1だけ数字が違うのきたら大小関係が判別できないはずだけどこれで合格でいいのかな?


 #include<stdio.h>
 #include<math.h>
 int main(){
	double a,b,c,myMax=0;
	int ansNo;
	for(int i=0;i<1000;i++){
		scanf("%lf,%lf",&a,&b);
		c=log(a)*b;
		printf("( %lf %lf)\n",log(a),b);
		if(c>myMax){
			myMax=c;
			ansNo=i+1;
		}
	}
	printf("%d\n",ansNo);
 }