/*
Code By RegKiller
雷劈数的基本概念: 把 3025 从中间分开为 30 和 25 , 30+25 = 55 , 55*55 = 3025
雷劈数的规律:它们被劈成的两数之和都是 9 或 11 的倍数或其和减 1 是 9 的倍数
本例只寻找偶数位的整数是否是雷劈数.
奇数位整数的雷劈数例:100 , 10+0 = 10 , 10*10 = 100 寻找时需逐位组合判断.计算量过大
本程序在 VC++ 6.0(SP6) 环境下成功编译
*/
using namespace std ;
//
最大范围从 0 到 18446744073709551615
void vLPNumber(unsigned __int64);
//
求雷劈数函数
int iNumberMD(unsigned __int64);
//
求偶数位整数从中间截断的位置
int main()
{
vLPNumber(MaxRange);
return
0 ;
}
void vLPNumber(unsigned __int64 iMaxRange)
{
//
循环的次数小于等于最大范围数开方
for
(unsigned __int64 i=1;iMaxRange>=i*i;i++)
{
unsigned __int64 iLPNumber=0,iLNumber=0,iRNumber=0,iNumberMD ;
//iLPNumber
: 雷劈数 , iLNumber : 分开后的左半数 , iRNumber : 分开后的右半数
iLPNumber=i*i ;
iNumberMD=:: iNumberMD(iLPNumber);
//
这里函数名前加 :: 是为了解决 = 前变量与 = 号后函数同名的问题
//
如果求出了中间截断位置就开始判断是不是雷劈数
if
(
false
!=iNumberMD)
{
iLNumber=iLPNumber
/iNumberMD
;
iRNumber=iLPNumber%iNumberMD ;
if
(i==iLNumber+iRNumber)
{
printf
(
"LPN:%I64d LN:%I64d RN:%I64d Sum:%I64d "
,iLPNumber,iLNumber,iRNumber,i);
//
Sum=iLNumber+iRNumber=i , cout 和 cin 无法正确处理 __int64 类型
//
左半数 + 右半数之和是 9 的倍数
if
(0==i%9)
{
cout<<
"<Sum%9=0> "
;
}
//
左半数 + 右半数之和是 11 的倍数
if
(0==i%11)
{
cout<<
"<Sum%11=0> "
;
}
//
左半数 + 右半数之和再 - 1 后还是 9 的倍数
if
(0==(i-1)%9)
{
cout<<
"<(Sum-1)%9=0>"
;
}
cout<<endl ;
}
}
}
}
int iNumberMD(unsigned __int64 iLPNumber)
{
unsigned __int64 iResult=0 ;
//
iResult : 偶数位整数从中间截断的位置
//
求整数的位数
while
(iLPNumber!=0)
{
iLPNumber=iLPNumber
/10
;
iResult++;
}
//
判断是否是偶数位的整数
if
(0==iResult%2)
{
unsigned __int64 temp=0 ;
temp=iResult ;
iResult=1 ;
while
(temp
/2
)
{
iResult*=10 ;
temp-=2 ;
}
return
iResult ;
//
是偶数位整数就返回截断整数的位置
}
else
return
false
;
//
奇数位整数不计算
}