特殊数据的处理(课设)
请编写程序,由系统随机产生一个正整数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)亲密数是两个正整数,其中一个整数的全部因子之和等于另一个(因子中不计本身),例如220和284是亲密数, 因为220的全部因子是1,2,4,5,10,11,20,22,44,55,110,和为284;而284的全部因子是1,2,4,71,142,和为220。
3)水仙花数是恰好等于自身各位数字立方和的数,例如153是水仙花数,因为153=13+53+33
4)阶乘和数是恰好等于自身各位数字阶乘的和的数,例如145是阶乘和数,因为145 = 1!+4!+5!。
5)自守数是平方后尾部数字是自身的数,例如9376是,因为93762=87909376。
6)孪生素数是差2的两个素数,例如197和199
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)同学来指教一下。