プロジェクトオイラー問315



#include<stdio.h>
#include<bitset>
#include<algorithm>
#include<iostream>

int nums[10]={63,3,118,103,75,109,125,15,127,111};

int wa(int n){
	int re=0;
	while(n>0){
		re+=n%10;
		n/=10;
 	}
	return re;
} 

int max(int n,int m){
	if(n<m){
		std::swap(n,m);
 	}
	std::bitset<8> bs;
	int re=0;
	while(n>0){
		if(m>0){
 			bs=(nums[n%10]^nums[m%10]);
		}else{
			bs=nums[n%10];
		}
		re+=bs.count();
		n/=10;
		m/=10;
	}
 	return re;
} 
 
int sam(int n){
	std::bitset<8> bs;
	int re=0;
	while(n>0){
		bs=nums[n%10];
		re+=bs.count();
		n/=10;
	}
 	return re;
} 

int calc(int n){
	int n1=wa(n);
	if(n1==n){
		return sam(n);
	}else{
		return sam(n)*2-max(n,n1)+calc(n1);
	}
} 
bool isPrime(int n){
	for(int i=2;i*i<=n;i+=1+(i&1)){
		if(n%i==0)return false;
	}
	return true;
}  

int main(){
	__int64 ans=0;
	for(int n=1000*10000;n<2000*10000;n++){
		if(isPrime(n)==false)continue;
		ans+=calc(n)-sam(n);
	}
	std::cout<<ans<<"\n";
} 
最終更新:2015年03月23日 04:58