题意:
1406357289是一个0至9全数字数,因为它由0到9这十个数字排列而成;但除此之外,它还有一个有趣的性质:子串的可整除性。记d1是它的第一个数字,d2是第二个数字,依此类推,我们注意到:
- d2d3d4=406能被2整除
- d3d4d5=063能被3整除
- d4d5d6=635能被5整除
- d5d6d7=357能被7整除
- d6d7d8=572能被11整除
- d7d8d9=728能被13整除
- d8d9d10=289能被17整除
找出所有满足同样性质数,并求它们的和。
/*************************************************************************
> File Name: euler043.c
> Author: WArobot
> Blog: http://www.cnblogs.com/WArobot/
> Created Time: 2017年06月27日 星期二 10时36分23秒
************************************************************************/
#include <stdio.h>
#include <inttypes.h>
#include <algorithm>
bool IsSubStringDivisibility (int32_t *num) {
int32_t p[7] = { 2 , 3 , 5 , 7 , 11 , 13 , 17 };
int32_t tmp = 0;
for (int32_t i = 1 ; i < 8 ; i++) {
tmp = num[i] * 100 + num[i + 1] * 10 + num[i + 2];
if (tmp % p[i -1]) return false;
}
return true;
}
int32_t main() {
int32_t num[10];
int64_t sum = 0 , tmp;
for (int32_t i = 0 ; i < 10 ; i++) num[i] = i;
do {
if (IsSubStringDivisibility(num)) {
tmp = 0;
for(int32_t i = 0 ; i < 10 ; i++){
tmp = tmp * 10 + (int64_t)num[i];
}
sum += tmp;
}
}while (std::next_permutation(num , num + 10));
printf("%"PRId64"\n",sum);
return 0;
}