c++解决四位玫瑰数/四叶玫瑰数的判断
四叶玫瑰数是指四位数各位上的数字的四次方之和等于本身的数。
四叶玫瑰数共有3个:1634,8208,9474
前注:这次的代码写的很泛用,其实改一下就可以求所有的自幂数,但是这里还是主要针对的是四叶玫瑰数。
具体实现如下:
#include <iostream>
using namespace std;
bool isRose(int num); //判断是否为四位玫瑰数的函数原型说明
int checkNumber(int num); //求所输入数字的位数函数的函数原型说明
int main(){
int a, b, flag = 1;
cin >> a >> b;
if (checkNumber(a) != 4){ //如果上限a不是四位数
cout << a << "不是四位数!" << endl;
}
if (checkNumber(b) != 4){ //如果下限b不是四位数
cout << b << "不是四位数!" << endl;
}
for (int i = a; i <= b; i++){ //循环求出a,b区间中的所有四位玫瑰数
if (isRose(i)){
cout << i << endl;
flag = 0; //flag用于标记有无输出四位玫瑰数,0表示输出过
}
}
if (checkNumber(a) == 4 && checkNumber(b) == 4 && flag){
//如果a,b是四位数,但是却没输出过四位玫瑰数
cout << "此区间没有四位玫瑰数!" << endl;
}
}
bool isRose(int num){ //判断一个数是否为四位玫瑰数
if (checkNumber(num) != 4)return false;
int arr1[100] = { 0 }, weishu = 0, sum = 0;
for (int i = 1, num1 = num, shuzu = 0; num / i; i = (i * 10)){ //这个循环用于获得num的每一位,当num/i==0时结束,i每过一次循环都会大10倍
//当num为一位时 循环进行一次 当num为两位 两次 三位 三次
arr1[shuzu] = num1 % 10; //依次获得从个位开始的每一位并且存入数组中
num1 = num1 / 10;
weishu++; //循环进行一次,表明位数需要加一
shuzu++; //shuzu用于标记数组的下标,++使它存到数组的下一位
}
for (int i = 0; i < weishu; i++){ //有多少位,进行多少次循环,即加多少位
sum = sum + arr1[i] * arr1[i] * arr1[i] * arr1[i];
}
if (sum == num){ //如果sum==num,则下结论num是四位玫瑰数
return true;
}
else{
return false;
}
}
int checkNumber(int num){ //求所输入数字的位数
int weishu = 0;
for (int i = 1, num1 = num, shuzu = 0; num / i; i = (i * 10)){
//当num为一位时 循环进行一次 当num为两位时 两次 ,三位时 三次
num1 = num1 / 10;
weishu++; //循环进行一次,位数加一
}
return weishu;
}
