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)<<")";
}
}

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2012年12月27日 04:04