【题目】求满足条件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是回文数 } }