「オイラープロジェクト用ソースコード」の編集履歴(バックアップ)一覧に戻る

オイラープロジェクト用ソースコード - (2012/12/27 (木) 04:04:35) のソース

bcc5.5で64ビット整数を表示したりsprintf等で使う記号は%I64lld。
少し覚えにくい。


整数の各桁の和を求めるコード。
文字列に変換し文字列を一ケタずつ数字のlistに変えて最後に集計している。
 (defun ketaSum(n)
  (apply #'+ (map 'list #'digit-char-p (princ-to-string n))))


とにかく素数がやたらと出てくるので素数を求めるテンプレ。
UP以下の素数を求め、それをテスト出力する。

 #include<stdio.h>
 #include<vector>
 #include<algorithm>
 const int up=1000000;
 std::vector<int> sosuu;
 bool so[up+1];
 void setSo(){
 	int i2;
 	memset(so,true,sizeof(so));
 	so[0]=so[1]=false;
 	for(int i=4;i<=up;i+=2)so[i]=false;
 	sosuu.push_back(2);
  	for(int i=3;i<=up;i+=2){
 		if(so[i]==false)continue;
 		sosuu.push_back(i);
 		i2=i*2;
 		for(int j=i*3;j<=up;j+=i2){
 			so[j]=false;
 		}
 	}
 }
 int main(){
 	setSo();
 	for(int i=0;i<100;i++){
 		//printf("%d ",sosuu[i]);
 	}
 }



ファイ関数を求めるバージョン。
でかい数でも大丈夫なあたりdouble型ってよくできてるなと思う。


 #include<stdio.h>
 #include<vector>
 #include<iostream>
 const int up=10000;//素数の上限
 std::vector<int> sosuu;
 bool so[up+1];
 void setSo(){
	int i2;
	memset(so,true,sizeof(so));
	so[0]=so[1]=false;
	for(int i=4;i<=up;i+=2)so[i]=false;
	sosuu.push_back(2);
 	for(int i=3;i<=up;i+=2){
		if(so[i]==false)continue;
		sosuu.push_back(i);
		i2=i*2;
		for(int j=i*3;j<=up;j+=i2){
			so[j]=false;
		}
	}
 }
 __int64 phi(__int64 n){
	double re=n;
	for(int i=0;i<sosuu.size()&&sosuu[i]*sosuu[i]<=n;i++){
		__int64 p=sosuu[i];
		int count=0;
		while(n%p==0){
			n/=p;
			count++;
		}
		if(count>0)re*=(1-1.0/p);
	}
	if(n!=1)re*=(1-1.0/n);
	return (__int64)re+0.5;
 }
 int main(){
	setSo();
	for(int i=1;i<100;i++){
		std::cout<<"("<<phi(i)<<")";
	}
 }