「オイラープロジェクト用ソースコード」の編集履歴(バックアップ)一覧はこちら
「オイラープロジェクト用ソースコード」(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)<<")";
}
}
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)<<")";
}
}