神秘的三位数 有这样一个3位数,组成它的3个数字阶乘之和正好等于它本身。
现在要求100到5000之间的神秘数
#include<stdio.h>
#include<iostream>
#include<cstring>
using namespace std;
int func(int a,long long int sum);//求3!+2!+1!
int jieji(long long int n);//求3! 2! 1!
int main()
{
for(int a=100;a<=5000;a++)//循环开始
{
long long int sum=0;
func(a,sum);
if(sum==a) cout<<a<<endl;//判断是否相等
else continue; //不相等就执行下一个
}
return 0;
}
int func(int a,long long int sum)//阶层
{
long long int i=1,gew[100];
while(a!=0)//分层
{
gew[i]=a%10;//3 2 1
sum=sum+jieji(gew[i]);//3!+2!+1!
i++;
a=a/10;
}
return sum;
}
int jieji(long long int n)//阶层 计算3! 2! 1!
{
long long int s=1;
if(n==0) return 0;
for(int j=1;j<=n;j++)
{
s=s*j;
}
return s;
}
你这个sum一直等于0
12行添加sum=
也可以改成引用传递,func的参数sum改为引用。
#include<stdio.h>
#include<iostream>
#include<cstring>
#if 0
using namespace std;
int get_factorial(int n)
{
int i, sum = 1;
for (i = 1; i <= n; i++)
sum *= i;
return sum;
}
int check_special_num(int n)
{
int sum = 0;
int tmp = n;
while (tmp) {
sum += get_factorial(tmp % 10);
tmp /= 10;
}
if (sum == n)
return 1;
return 0;
}
int main(void)
{
int i;
for (i = 100; i < 1000; i++)
if (check_special_num(i))
cout<<i<<endl;
return 0;
}
#endif
#if 1
using namespace std;
int func(int a,long long int sum);//求3!+2!+1!
int jieji(long long int n);//求3! 2! 1!
int main()
{
//for(int a=100;a<=5000;a++)//循环开始 /*既然是三位数,把循环条件定义的更精确一些*/
for(int a=100;a<1000;a++)//循环开始
{
long long int sum=0;
if (func(a, sum) == a)//;
/*if(sum==a) */cout<<a<<endl;//判断是否相等
///else continue; //不相等就执行下一个, 代码冗余
}
return 0;
}
int func(int a,long long int sum)//阶层
{
long long int i=1,gew[100];
while(a!=0)//分层
{
gew[i]=a%10;//3 2 1
sum= sum+jieji(gew[i]);//3!+2!+1!
i++;
a=a/10;
}
return sum;
}
int jieji(long long int n)//阶层 计算3! 2! 1!
{
long long int s=1;
if(n==0) return 0;
for(int j=1;j<=n;j++)
{
s=s*j;
}
return s; //返回long long int,而返回类型是int,因此数据长度会被截断
}
#endif
三个9的阶乘之和也不会大于int的取值范围,因此用不上long long int,对于要求的三位数,也用不上申请100长度的数组;
供参考,上面的是个人写的,可以参考一下~
#include <iostream>
using namespace std;
//阶乘之和最大5000,int类型足矣
int func(int a); //返回3!+2!+1!的和
int jieji(int n); //返回阶乘,求3! 2! 1!
int main()
{
for (int a = 100; a <= 5000; a++) //循环开始
{
if (func(a) == a) //判断是否相等
cout << a << endl;
//else
// continue; //不相等就执行下一个
}
return 0;
}
int func(int a) //阶层
{
int sum = 0;
int n, t;
while (a != 0) //分层
{
n = a % 10;
t = jieji(n);
sum += t; //3!+2!+1!
a /= 10;
}
return sum;
}
int jieji(int n) //阶层 计算3! 2! 1!
{
//改用递归算阶乘
if (n == 0)
return 1; //0!= 1
return n * jieji(n - 1);
}