cpp: Narcissistic in C++11
// NarcissisticList.h :
//练习案例:水仙花数 100 - 1000 NarcissisticList
//案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
//例如:1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153
//请利用do...while语句,求出所有3位数中的水仙花数// 2023年4月5日 涂聚文 Geovin Du edit. c++ 11
//
//
//
#pragma once
#ifndef NARCISSISTICLIST_H
#define NARCISSISTICLIST_H
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <iostream>
#include <string>
#include <list>
#include "NarcissisticInfo.h"
namespace geovindu
{
/**
* @brief 水仙花数集合类.
* 水仙花数集合类.
*/
class NarcissisticList
{
private:
list<NarcissisticInfo> NarcissisticInfos;
public:
/**
* @brief.
*
* \param narcissisticInfos
*/
void setNarcissisticList(list<NarcissisticInfo> narcissisticInfos)
{
this->NarcissisticInfos = narcissisticInfos;
}
/**
* @brief.
*
* \return
*/
list<NarcissisticInfo> getNarcissisticInfo()
{
return NarcissisticInfos;
}
/**
* @brief.
*
* \param narcissisticInfos
*/
//NarcissisticList(list<NarcissisticInfo> narcissisticInfos)
//{
//this->NarcissisticInfos = narcissisticInfos;
//}
/**
* @brief.
*
*/
void ShowInfo();
};
}
#endif
// NarcissisticInfo.h :
//练习案例:水仙花数 100 - 1000 NarcissisticNumber
//案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
//例如:1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153
//请利用do...while语句,求出所有3位数中的水仙花数
// 2023年4月5日 涂聚文 Geovin Du edit.
// https://mathworld.wolfram.com/NarcissisticNumber.html
//
#pragma once
#ifndef NARCISSISTICINFO_H
#define NARCISSISTICINFO_H
#include <iostream>
#include<string.h>
#include<math.h>
using namespace std;
/**
* @brief
* \author geovindu.
* \date 20230-4-10
*/
namespace geovindu
{
/**
* @brief 水仙花数 实体类.
*/
class NarcissisticInfo
{
private:
string NarcissisticName;
int NarcissisticDigit;
public:
NarcissisticInfo(string name,int digit)
{
this->NarcissisticName = name;
this->NarcissisticDigit = digit;
}
NarcissisticInfo(const NarcissisticInfo& child) {
this->NarcissisticName = child.NarcissisticName;
this->NarcissisticDigit = child.NarcissisticDigit;
}
/*
NarcissisticInfo& operator=(const NarcissisticInfo& child) {//第一个&表明返回值是计算结果的引用,第二个&表明使用c的引用,const表明不会改变c
this->NarcissisticName = child.NarcissisticName;
this->NarcissisticDigit = child.NarcissisticDigit;
return *this;//返回对象的引用(如果是前面不是NarcissisticInfo &而是NarcissisticInfo,那么返回的就是对象的拷贝)
}
*/
void setNarcissisticName(string narcissisticName)
{
this->NarcissisticName = narcissisticName;
}
void setNarcissisticDigit(int narcissisticDigit)
{
this->NarcissisticDigit = narcissisticDigit;
}
string getNarcissisticName()
{
return NarcissisticName;
}
int getNarcissisticDigit()
{
return NarcissisticDigit;
}
//void ShowInfo();
};
/**
* @brief 水仙花数显示.
*
*/
//void NarcissisticInfo::ShowInfo()
//{
//cout << "名称:" << this->getNarcissisticName() << ",水仙花数:" << this->getNarcissisticDigit() << endl;
//}
}
#endif
// NarcissisticNumber.h :
//练习案例:水仙花数 100 - 1000 NarcissisticNumber
//案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
//例如:1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153
//请利用do...while语句,求出所有3位数中的水仙花数// 2023年4月5日 涂聚文 Geovin Du edit.
//
//
#pragma once
#ifndef NARCISSISTICNUMBER_H
#define NARCISSISTICNUMBER_H
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <iostream>
#include <string>
#include "NarcissisticInfo.h"
#include "NarcissisticList.h"
using namespace std;
/**
* @brief
* \author geovindu.
* \date 20230-4-10
*/
namespace geovindu
{
/**
* @brief 水仙花数.
*/
class NarcissisticNumber
{
private:
//typedef list<NarcissisticInfo> getlist;
public:
static int countA;
/**
* @brief 水仙花数.
*
*/
void setNarcissisticNumber();
/**
* @brief .
*
* \return
*/
NarcissisticInfo GetNarcissisticInfo();
/**
* @brief.
*
* \param name
* \param digit
* \return
*/
NarcissisticInfo GetNarcissisticInfo(string name, int digit);
/**
* @brief 水仙花数.
*
* \return 返回实体类集合
*/
NarcissisticList setNarcissisticInfoList();
/**
* @brief 水仙花数.
* 指定范围内的整数中的水仙花数
* \param min 输入参数 【int】 范围内的最小整数
* \param max 输入参数 【int】 范围内的最大整数
*/
void setNarcissisticNumber(int min,int max);
/**
* @brief 水仙花数.
* 指定范围内的整数中的水仙花数
* \param min 输入参数 【int】 范围内的最小整数
* \param max 输入参数 【int】 范围内的最大整数
* \return 返回实体类集合
*/
NarcissisticList setNarcissisticInfoList(int min, int max);
/**
* @brief .水仙花数
* 判断是否是水仙花数
* \param number 输入参数 【int】 整数
* \return 返回是否为真
*/
bool IsNarcissisticNumber(int number);
/**
* @brief 水仙花数.
* function to count digits
* \param number 输入参数 【int】 整数
* \return 返回位数
*/
int NarcissisticCountDigit(int number);
/**
* @brief 水仙花数.
* Returns true if n is Narcissistic number
* \param number 输入参数 【int】 整数
* \return 返回是否为真
*/
bool NarcissisticCheck(int number);
/**
* @brief.
*
* \param n
* \return
*/
int NarcissisticCube(const int n);
/**
* @brief
* .
*/
bool IsNarcissistic(const int n);
};
}
#endif
// NarcissisticNumber.h :
//练习案例:水仙花数 100 - 1000 NarcissisticNumber
//案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
//例如:1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153
//请利用do...while语句,求出所有3位数中的水仙花数
// 2023年4月5日 涂聚文 Geovin Du edit.
// https://mathworld.wolfram.com/NarcissisticNumber.html
//
#include "NarcissisticNumber.h"
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <iostream>
#include <list>
using namespace std;
/**
* @brief
* \author geovindu.
* \date 20230-4-10
*/
namespace geovindu
{
/**
* @brief 计录个数
* .
*/
int NarcissisticNumber::countA;
/**
* @brief 水仙花数.
* 100至1000内的三位数的水仙花数
* 153 370 371 407
*/
void NarcissisticNumber::setNarcissisticNumber()
{
int i = 100;
int min = 100;
int max = 1000;
int countA = 0;
do
{
if (NarcissisticCheck(i)) //IsNarcissisticNumber
{
cout << "" << i <<"是水仙花数"<< endl;
countA++;
}
i++;
} while (i >= min && i < max);
cout << "水仙花数有【" << countA <<"】个数。" << endl;
}
/**
* @brief 水仙花数.
* 100至1000内的三位数的水仙花数
* 153 370 371 407
*/
NarcissisticInfo NarcissisticNumber::GetNarcissisticInfo() {
NarcissisticInfo info("水仙花数", 153);
return info;
}
/**
* @brief 水仙花数.
*
* \param name
* \param digit
* \return
*/
NarcissisticInfo NarcissisticNumber::GetNarcissisticInfo(string name, int digit) {
NarcissisticInfo info(name, digit);
return info;
}
/**
* @brief 水仙花数.
*
* \return 返回实体类集合
*/
NarcissisticList NarcissisticNumber::setNarcissisticInfoList()
{
int i = 100;
int min = 100;
int max = 1000;
//int countA = 0;
list<NarcissisticInfo> list;
//NarcissisticInfo info;
NarcissisticList nlist;
do
{
if (NarcissisticCheck(i)) //IsNarcissisticNumber
{
//cout << "" << i << "是水仙花数" << endl;
//info.setNarcissisticDigit(i);
//info.setNarcissisticName("水仙花数");
NarcissisticInfo info("水仙花数", i);
list.push_back(info);
countA++;
}
i++;
} while (i >= min && i < max);
nlist.setNarcissisticList(list);
cout << "实体类操作,水仙花数有【" << countA << "】个数。" << endl;
return nlist;
}
/**/
/**
* @brief 水仙花数.
* 指定范围内的整数中的水仙花数
* \param min 输入参数 【int】 范围内的最小整数
* \param max 输入参数 【int】 范围内的最大整数
*/
void NarcissisticNumber::setNarcissisticNumber(int min, int max)
{
int i = min;
//int countA = 0;
do
{
if (NarcissisticCheck(i)) // IsNarcissisticNumber
{
cout << "" << i << "是水仙花数" << endl;
countA++;
}
i++;
} while (i >= min && i < max);
cout << "水仙花数有【" << countA << "】个数。" << endl;
}
/**
* @brief 水仙花数.
* 指定范围内的整数中的水仙花数
* \param min 输入参数 【int】 范围内的最小整数
* \param max 输入参数 【int】 范围内的最大整数
* \return 返回实体类集合
*/
NarcissisticList NarcissisticNumber::setNarcissisticInfoList(int min, int max)
{
int i = min;
//int countA = 0;
static list<NarcissisticInfo> list;
//NarcissisticInfo info;
NarcissisticList nlist;
do
{
if (NarcissisticCheck(i)) //IsNarcissisticNumber
{
//cout << "" << i << "是水仙花数" << endl;
//info.setNarcissisticDigit(i);
//info.setNarcissisticName("水仙花数");
NarcissisticInfo info("水仙花数", i);
list.push_back(info);
countA++;
}
i++;
} while (i >= min && i < max);
nlist.setNarcissisticList(list);
return nlist;
}
/**
* @brief .水仙花数
* 判断是否是水仙花数
* \param number 输入参数 【int】 整数
* \return 返回是否为真
*/
bool NarcissisticNumber::IsNarcissisticNumber(int number)
{
bool isok = false;
int original, rem, sum = 0, digit = 0;
original = number;
/* Counting number of digit in a given number */
while (number != 0)
{
digit++;
number = number / 10;
}
/* After execution above loop number becomes 0
So copying original number to variable number */
number = original;
/* Finding sum */
while (number != 0)
{
rem = number % 10;
sum = sum + pow(rem, digit);
number = number / 10;
}
/* Making decision */
if (sum == original)
{
//printf("%d is ARMSTRONG.", original);
isok = true;
}
else
{
//printf("%d is NOT ARMSTRONG.", original);
isok = false;
}
return isok;
}
/**
* @brief 水仙花数.
* function to count digits
* \param number 输入参数 【int】 整数
* \return 返回位数
*/
int NarcissisticNumber::NarcissisticCountDigit(int number)
{
if (number == 0)
return 0;
return 1 + NarcissisticCountDigit(number / 10);
}
/**
* @brief 水仙花数.
* Returns true if n is Narcissistic number
* \param number 输入参数 【int】 整数
* \return 返回是否为真
*/
bool NarcissisticNumber::NarcissisticCheck(int number)
{
// count the number of digits
int l = NarcissisticCountDigit(number);
int dup = number;
int sum = 0;
// calculates the sum of digits
// raised to power
while (dup)
{
sum += pow(dup % 10, l);
dup /= 10;
}
return (number == sum);
}
int NarcissisticNumber::NarcissisticCube(const int n)//求立方函数
{
return n * n * n;
}
bool NarcissisticNumber::IsNarcissistic(const int n)//判断是否是水仙花数
{
int hundreds = n / 100;
int tens = n / 10 - hundreds * 10;
int ones = n % 10;
return NarcissisticCube(hundreds) + NarcissisticCube(tens) + NarcissisticCube(ones) == n;
}
/**
* @brief 水仙花数.
* function to count digits
* \param number 输入参数 【int】 整数
* \return 返回位数
*/
int NarcissisticCountDigits(int number)
{
if (number == 0)
return 0;
return 1 + NarcissisticCountDigits(number / 10);
}
/**
* @brief 水仙花数.
* Returns true if n is Narcissistic number
* \param number 输入参数 【int】 整数
* \return 返回是否为真
*/
bool NarcissisticChecks(int number)
{
// count the number of digits
int l = NarcissisticCountDigits(number);
int dup = number;
int sum = 0;
// calculates the sum of digits
// raised to power
while (dup)
{
sum += pow(dup % 10, l);
dup /= 10;
}
return (number == sum);
}
}
// NarcissisticList.cpp :
//练习案例:水仙花数 100 - 1000 NarcissisticList
//案例描述:水仙花数是指一个 3 位数,它的每个位上的数字的 3次幂之和等于它本身
//例如:1 ^ 3 + 5 ^ 3 + 3 ^ 3 = 153
//请利用do...while语句,求出所有3位数中的水仙花数// 2023年4月5日 涂聚文 Geovin Du edit.
//
#include "NarcissisticList.h"
#include <iostream>
#include <string>
using namespace std;
/**
* @brief
* \author geovindu.
* \date 20230-4-10
*/
namespace geovindu
{
/**
* @brief
* .
*
*/
void NarcissisticList::ShowInfo()
{
for(auto info:getNarcissisticInfo())
{
cout << "实体类操作:【仙花数】:" << info.getNarcissisticName() << ",数字为:" << info.getNarcissisticDigit()<< endl;
//cout << "个数:"<<getNarcissisticInfo().size() << endl;
}
}
}
/**
* @brief 水仙花数.
*
* \return
*/
NarcissisticList Geovin::getInfo()
{
NarcissisticNumber number;
//NarcissisticInfo info = number.GetNarcissisticInfo("水仙花数", 153);
//NarcissisticInfo info("水仙花数",153);
//
//info.setNarcissisticDigit(39);
//info.setNarcissisticName("");
NarcissisticList infos = number.setNarcissisticInfoList();
for (auto info : infos.getNarcissisticInfo())
{
cout << "实体类返回:" << info.getNarcissisticName() << "水仙花数" << info.getNarcissisticDigit() << endl;
}
cout << "共有个数:" << infos.getNarcissisticInfo().size() << "" << endl;
return infos;
}
/**
* @brief 水仙花数.实体类
* 100至1000内的三位数的水仙花数
*/
list<NarcissisticInfo> Geovin::DisplayNarcissicticInfos()
{
NarcissisticNumber number;
list<NarcissisticInfo> infos;
//infos = number.setNarcissisticList();
if (!infos.empty())
{
for (NarcissisticInfo info : infos)
{
cout << "" << info.getNarcissisticName() << ",水仙花数:" << info.getNarcissisticDigit() << endl;
}
}
//cout << "水仙花数有【" << number.countA << "】个数。" << endl;
return infos;
}
/**
* @brief 水仙花数.
* 100至1000内的三位数的水仙花数
*/
void Geovin::DisplayNarcissisticNumber()
{
NarcissisticNumber narcissistic;
narcissistic.setNarcissisticNumber();
}
/**
* @brief 水仙花数.
* 指定范围内的整数中的水仙花数
* \param min 输入参数 【int】 范围内的最小整数
* \param max 输入参数 【int】 范围内的最大整数
*/
void Geovin::DisplayNarcissisticNumber(int min, int max)
{
NarcissisticNumber narcissistic;
narcissistic.setNarcissisticNumber(min,max);
}
调用:
//水仙花数 100-1000 实体类 //geovin.getInfo(); geovin.getInfo().ShowInfo(); // //geovin.DisplayNarcissicticInfos(); //水仙花数 100-1000 geovin.DisplayNarcissisticNumber(); //敲桌子 geovin.DisplayDeskKnock(100);

哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)生存.---Geovin Du(涂聚文)
浙公网安备 33010602011771号