📄 雷劈数.cpp
字号:
/*
雷劈数的基本概念: 把 3025 从中间分开为 30 和 25 , 30+25 = 55 , 55*55 = 3025
雷劈数的规律:它们被劈成的两数之和都是 9 或 11 的倍数或其和减 1 是 9 的倍数
本例只寻找偶数位的整数是否是雷劈数.
奇数位整数的雷劈数例:100 , 10+0 = 10 , 10*10 = 100 寻找时需逐位组合判断.计算量过大
本程序在 VC++ 6.0(SP6) 环境下成功编译
*/
#include<iostream>
using namespace std ;
#define MaxRange 18446744073709551615
// 最大范围从 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 ;
// 奇数位整数不计算
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -