特殊数据的处理:(1)完全数,(2)亲密数,(3)水仙花数,(4)阶乘和数,(5)自守数,(6)孪生素数;

文本详细描述了一个C++程序,用于生成并检测1到n范围内的特殊数据,如完全数、亲密数、水仙花数等,通过菜单输入n并利用递归和循环结构实现。
摘要由CSDN通过智能技术生成

特殊数据的处理(课设)

请编写程序,由系统随机产生一个正整数n(1<n<50000),根据菜单提示,选择输出小于n的以下7种特殊数据中的一种:(1)完全数,(2)亲密数,(3)水仙花数,(4)阶乘和数,(5)自守数,(6)孪生素数;直到用户退出系统。

功能要求如下:

(1)系统以菜单方式工作。

(2)采用1行输出5个数据的格式。

  (3)主函数实现正整数n的随机产生和菜单的显示,如下图所示。数据n作为函数的实参传递给各个子函数。

  (4)子函数实现1到n之间的特殊数据的判断和输出,不同类型特殊数据的判断用不同子函数实现。

说明:各类特殊数据的解释如下:

1)完全数是恰好等于自身的因子之和的数,例如6是完全数,因为6=1*2*3=1+2+3

2)亲密数是两个正整数,其中一个整数的全部因子之和等于另一个(因子中不计本身),例如220284是亲密数, 因为220的全部因子是1245101120224455110,和为284;而284的全部因子是12471142,和为220 

3)水仙花数是恰好等于自身各位数字立方和的数,例如153是水仙花数,因为153=13+53+33

4)阶乘和数是恰好等于自身各位数字阶乘的和的数,例如145是阶乘和数,因为145 = 1!+4!+5! 

5)自守数是平方后尾部数字是自身的数,例如9376是,因为93762=87909376 

6)孪生素数是差2的两个素数,例如197199

text.cpp

//主函数

#include "text.h"

int main()
{
    int n, x;
    cout << "请输入n: ";
    cin >> n;
    menu();

    while (true)
    {
        cout << "请输入选择: ";
        cin >> x;
        switch (x)
        {
        case 1:
            Whole(n);//完全数
            break;
        case 2:
            Dear(n);//亲密数
            break;
        case 3:
            WaterFlower(n);
            break;
        case 4:
            Factorial_Sum(n);
            break;
        case 5:
            Self_shou(n);
            break;
        case 6:
            Twin_Prime(n);
            break;
        case 0:
            return 0;
        default:
            cout << "输入错误,请重新输入" << endl;
            break;
        }
    }
    return 0;
}

text.h

//存放各种声明

#pragma once
#include<iostream>
using namespace std;

void menu();

void Whole(int n);//完全数

void Dear(int n);//亲密数

int Cal_Dear(int n);

void WaterFlower(int n);//水仙花数
 
void Factorial_Sum(int n);//阶乘和数

long long CalFactorial_Sum(int n);

long long Fac(int n);

void Self_shou(int n);//自守数

void Twin_Prime(int n);//孪生素数

bool CalTwin_Prime(int n);

func.cpp//存放函数

#include "text.h"
void menu()
{
    cout << "**************************" << endl;
    cout << "    1.输出完全数          " << endl;
    cout << "    2.输出亲密数          " << endl;
    cout << "    3.输出水仙花数        " << endl;
    cout << "    4.输出阶乘和数        " << endl;
    cout << "    5.输出自守数          " << endl;
    cout << "    6.输出孪生素数        " << endl;
    cout << "    0.退出                " << endl;
    cout << "**************************" << endl;
}
void Whole(int n)
{
    int sum = 0, m = 0;   //m用来控制一行的数据个数来输出

    for (int i = 1; i <= n; i++)
    {
        sum = 0;
        for (int j = 1; j <= i / 2; j++)
        {
            if (i % j == 0)sum += j;
        }
        if (sum == i)
        {
            cout << i << " ";
            if (++m % 5 == 0)cout << endl;//采用1行输出5个数据的格式。
        }
    }
    cout << endl << endl;
}

void Dear(int n)
{
    int m = 0, rec, rec2;
    for (int i = 1; i <= n; i++)
    {
        rec = Cal_Dear(i);
        rec2 = Cal_Dear(rec);
        if (rec2 == i &&i<rec)
        {
            printf("(%d,%d) ",i,rec);
            if (++m % 5 == 0)cout << endl;
        }
    }
    cout << endl << endl;
}

int Cal_Dear(int n)
{
    int sum = 0;
    for (int i = 1; i <= n / 2; i++)
    {
        if (n % i == 0)sum += i;
    }
    return sum;

}

void WaterFlower(int n)
{
    for (int i = 1; i <= n; i++)
    {
        int sum = 0, tem, m = 0;
        tem = i;
        while (tem)
        {
            sum += (tem % 10) * (tem % 10) * (tem % 10);
            tem /= 10;
        }
        if (i == sum)
        {
            cout << i << " ";
            if (++m % 5 == 0)cout << endl;
        }
    }
    cout << endl << endl;
}

void Factorial_Sum(int n)
{
    long long  m = 0;
    for (int i = 1; i <= n; i++)
    { 
        
        long long rec = CalFactorial_Sum(i);
        
        if (i == rec)
        {
            cout << i << " ";
            if (++m % 5 == 0)cout << endl;
        }
    }
    cout << endl << endl;
}

long long CalFactorial_Sum(int n)
{
    long long sum = 0;
    while(n)
    {
        sum += Fac(n%10);
        n /= 10;
    }
    return sum;

}


long long Fac(int n)//求阶乘
{
    long long p = 1;
    if (n == 1||n==0)//n会出现零的情况
        return 1;
    else
    {
        p = n * Fac(n - 1);
        return p;
    }
}

void Self_shou(int n)
{
    int m = 0;
    for (int i = 1; i <= n; i++)
    {
        bool flog = true;
        int tem = i, tem2 = i * i;;
        while (tem)
        {
            if (tem % 10 != tem2 % 10)
                flog = false;
            tem /= 10;
            tem2 /= 10;
        }
        if (flog == true)
        {
            cout << i << " ";
            if (++m % 5 == 0)cout << endl;
        }

    }
    cout << endl << endl;
}

void Twin_Prime(int n)
{
    int m = 0;
    for (int i = 2; i <= n; i++)//素数从2开始
    {
        bool flog = CalTwin_Prime(i);
        if (flog)
        {
            bool flog2 = CalTwin_Prime(i+2);
            if (flog2)
            {
                cout << i << " ";
                if (++m % 5 == 0)cout << endl;
            }
        }

    }
    cout << endl << endl;
}

bool CalTwin_Prime(int n)
{
    for (int i = 2; i <= n / 2; i++)
    {
        if (n % i == 0)return false;
    }
    return true;
}


欢迎未来的大佬(ZhaoPiao)同学来指教一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值