⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 雷劈数.cpp

📁 C 与 C++ 的部分小代码整体打包下载
💻 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 + -