以下是使用C++实现的相同逻辑代码:
#include<iostream>#include<vector>#include<string>#include<cmath>// 判断一个数是否为水仙花数boolisNarcissistic(intn){std::string numStr=std::to_string(n);intnumDigits=numStr.length();intsum=0;// 遍历每一位数字for(inti=0;i<numDigits;i++){// 将字符数字转换为整数intdigit=numStr[i]-'0';// 计算该位数字的 n 次幂并累加sum+=static_cast<int>(std::pow(digit,numDigits));}// 判断总和是否等于原数returnsum==n;}// 查找指定范围内的水仙花数std::vector<int>findNarcissisticNumbers(intmin,intmax){std::vector<int>results;for(inti=min;i<=max;i++){if(isNarcissistic(i)){results.push_back(i);}}returnresults;}intmain(){// 输出所有3位水仙花数(100-999)std::vector<int>narcissisticNumbers=findNarcissisticNumbers(100,999);// 格式化输出if(!narcissisticNumbers.empty()){std::cout<<"3位水仙花数有:"<<std::endl;for(intnum:narcissisticNumbers){std::cout<<num<<std::endl;}}else{std::cout<<"该范围内没有水仙花数"<<std::endl;}return0;}以下是使用纯数学运算(不用字符串转换)的替代版本:
#include<iostream>#include<vector>// 判断一个数是否为水仙花数(纯数学方法)boolisNarcissistic(intn){intoriginal=n;intnumDigits=0;inttemp=n;// 计算位数while(temp>0){numDigits++;temp/=10;}intsum=0;temp=original;// 遍历每一位数字while(temp>0){intdigit=temp%10;// 计算digit的numDigits次幂intpower=1;for(inti=0;i<numDigits;i++){power*=digit;}sum+=power;temp/=10;}// 判断总和是否等于原数returnsum==original;}// 查找指定范围内的水仙花数std::vector<int>findNarcissisticNumbers(intmin,intmax){std::vector<int>results;for(inti=min;i<=max;i++){if(isNarcissistic(i)){results.push_back(i);}}returnresults;}intmain(){// 输出所有3位水仙花数(100-999)std::vector<int>narcissisticNumbers=findNarcissisticNumbers(100,999);// 格式化输出if(!narcissisticNumbers.empty()){std::cout<<"3位水仙花数有:"<<std::endl;for(intnum:narcissisticNumbers){std::cout<<num<<std::endl;}}else{std::cout<<"该范围内没有水仙花数"<<std::endl;}return0;}两个版本的功能相同,都能正确找到153、370、371、407这4个3位水仙花数。第一个版本更接近原Lua代码的逻辑,使用字符串处理;第二个版本使用纯数学运算,在某些情况下性能更好。