【题目】求满足条件n=a!+b!+c!的所有三位数n并输出,要求用自定义函数实现求阶乘。
【本讲结构】
(一)题目讲解视频
(二)相关习题
(三)此类题目的共有特征及典型算法
(四)视频中的代码
(五)部分相关习题的参考例程
【正文部分】
(一)题目讲解视频
- 若一个正整数n的所有小于n的因子之和等于n, 则称n为完全数, 如6=1+2+3是完全数。判断正整数n是否为完全数。
- 输出1000以内的所有完全数;
- 输入一个正整数,判断其是否为一个素数;
- 输出1000以内的所有素数;
- 输入一个正整数,判断其是否为一个回文数(例1221、12321都是回文数);
- 输出10000以内的所有回文数;
- (*)输出输出10000以内的所有回文素数(提醒:某数是素数后再判断是否也是回文数。);
- 若一个素数的反序数仍为素数,则称它为可逆素数。求10000以内的所有可逆素数。
- 求1000000以内的正整数n,要求9n是n的反序数(例如,123是321的反序数)。
此类题目的共有特征是,需要考察一定范围内的数字符合某种特定的条件,从大的框架讲,就需要逐个考察相应范围内的每一个数字。因此,程的顶层结构是:
for(n=下限;n<=上限;n+=增量) //增量不一定固定为1
{
为构造条件进行相关的计算;
if(条件成立) 输出符合要求的结果
}
(四)视频中的代码
#include<iostream>
using namespace std;
int fact(int);
int main()
{
int abc,a,b,c,sum;
abc=100;
while(abc<1000)
{
//考察abc是否符合要求
c=abc%10;
b=(abc/10)%10;
a=abc/100;
sum=fact(a)+fact(b)+fact(c);
if(sum==abc)
cout<<abc<<" ";
++abc;
}
return 0;
}
int fact(int n)
{
int i, f=1;
for(i=1;i<=n;++i)
f=f*i;
return f;
}
(五)部分相关习题的参考例程
(*)输出输出10000以内的所有回文素数(提醒:某数是素数后再判断是否也是回文数。);
#include "iostream.h"
#include "math.h"
void main()
{
int i,j,s,n;
cout<<2<<endl;
for(i=3;i<10000;i+=2)
{
n=int(sqrt(i));
for(j=3;j<=n;j+=2) // 判断i是否为素数
if (i%j==0) break;
if (j<=n) continue; // i不是素数
n=i;
s=0;
while(n) // 求n的反序数s
{
s=10*s+n%10; // 将上次累加和的10倍与新分离出的位相加
n/=10; // 将n缩小10倍
}
if (s==i) cout<<i<<endl; // i与其反序数相等,i是回文数
}
}