C语言程序设计100例之(4):水仙花数

例4    水仙花数

题目描述

一个三位整数(100~999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数。

输入格式

没有输入

输出格式

若干行,每行1个数字。

输入样例

输出样例

153

* * *

...

* * *

(输出被和谐了)

(1)编程思路1。

对三位数n(n为100~999之间的整数)进行穷举。对每个枚举的n,分解出其百位a(a=n/100)、十位b(b=n/10%10)和个位c( c=n%10),若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。

(2)源程序1。

#include <stdio.h>

int main()

{

int n, a, b, c;        //n、a、b和c分别为三位数自身及其百位、十位和个位

for(n=100 ;n<=999;n++)

{

a=n/100;

b=n/10%10;

c=n%10;

if(a*a*a+b*b*b+c*c*c== n)

printf("%d\n",n);

}

return 0;

}

(3)编程思路2。

用一个三重循环对一个3位数的百位a(a的范围为1~9)、十位b(b的范围为0~9)和个位c(c的范围为0~9)进行穷举,在循环体中,计算出3位数n(n=100*a+10*b+c),然后进行判断,若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。

(4)源程序2。

#include <iostream>

using namespace std;

int main()

{

int n, a, b, c;        //n、a、b和c分别为三位数自身及其百位、十位和个位

for(a=1 ;a<=9;a++)

for (b=0; b<=9;b++)

for(c=0;c<=9;c++)

{

n=100*a+10*b+c;

if(a*a*a+b*b*b+c*c*c== n)

printf("%d\n",n);

}

return 0;

}

习题4

4-1  子数整数

本题选自洛谷题库 (https://www.luogu.org/problem/P1151)

题目描述

对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:

sub1=a1a2a3

sub2=a2a3a4

sub3=a3a4a5

例如,五位数20207可以拆分成

sub1=202

sub2=020(=20)

sub3=207

现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1 ,sub2 ,sub3都可被K整除。

输入格式

一个正整数K

输出格式

每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“No”。

输入样例

15

输出样例

22555

25555

28555

30000

(1)编程思路。

本题关键是分离出一个五位数n的三个子数sub1 ,sub2 和sub3。由于sub1是n的高3位数,因此,sub1=n/100;sub2是n的中间3位数,因此,sub2=n/10%1000;sub3是n的低3位数,因此,sub3=n%1000。

用循环for (n=10000;n<=30000;n++)对每个五位数n进行穷举判断即可。

(2)源程序。

#include <stdio.h>

int main()

{

int i,sub1,sub2,sub3,k,f=0;

scanf("%d",&k);

for (i=10000;i<=30000;i++)

{

sub1=i/100;

sub2=i/10%1000;

sub3=i%1000;

if (sub1%k==0 && sub2%k==0 && sub3%k==0)

{

printf("%d\n",i);

f=1;

}

}

if (f==0) printf("No\n");

return 0;

}

4-2  4位分段和平方数

题目描述

一个4位自然数分为前后两个2位数,若该数等于所分两个2位数和的平方,则称为4位分段和平方数。例如,2025=(20+25)2

编写程序求出所有4位分段和平方数。

输入格式

没有输入

输出格式

若干行,每行1个数字。

输入样例

输出样例

2025

* * *

...

* * *

(输出被和谐了)

(1)编程思路1。

对所有的4位整数n进行穷举,n的范围为1000~9999,共9000个数。对每个数n,分离出高两位数x(x=n/100)和低两位数y(y=n%100),然后进行判断,若满足n==(x+y)*(x+y),则n是一个4位分段和平方数。

(2)源程序1。

#include <stdio.h>

int main()

{

int n,x,y;

for(n=1000;n<=9999;n++)

{

x=n/100;

y=n%100;

if (n==(x+y)*(x+y))

printf("%d\n",n);

}

return 0;

}

(3)编程思路2。

思路1的穷举次数为9000次。实际上,由于4位分段和平方数一定首先是一个平方数,因此只需要穷举4位数中的平方数即可,即穷举sqrt(1000)~sqrt(9999)之间的数a,在循环体中,先计算出4位数n=a*a,再分离出高两位数x(x=n/100)和低两位数y(y=n%100),然后进行判断,若满足a==(x+y),则n是一个4位分段和平方数。显然,这样穷举,循环次数会大为减少。

(4)源程序2。

#include <stdio.h>

#include <math.h>

int main()

{

int a,n,x,y;

for(a=(int)sqrt(1000);a<=(int)sqrt(9999);a++)

{

n=a*a;

x=n/100;

y=n%100;

if (a==x+y)

printf("%d\n",n);

}

return 0;

}

4-3  特定的四位数

题目描述

有这样一些特定的四位数,它的千位数字与十位数字之和等于百位数字与个位数字之积。例如,3136,  3+3=1*6 ,故3136就是一个特定的四位数。

输入格式

一个正整数K(1111<=K<=9999)

输出格式

一个不大于K的最大的特定四位数。

输入样例

8000

输出样例

7921

(1)编程思路。

从k开始对四位数i进行穷举,对每个四位数i分离出千位a(a=i/1000)、百位b(b=(i-a*1000)/100)、十位c(c=(i-a*1000-b*100)/10)和个位d(d=i%10)。

(2)源程序。

#include<stdio.h>

int main()

{

int i,k,a,b,c,d;

scanf("%d",&k);

for (i=k; i>=1000; i--)

{

a=i/1000 ;

b=(i-a*1000)/100;

c=(i-a*1000-b*100)/10;

d=i%10;

if  (a+c==b*d)

{

printf("%d\n",i);

break;

}

}

return 0;

}

原文地址:https://www.cnblogs.com/cs-whut/p/11854563.html

时间: 2024-10-02 15:54:15

C语言程序设计100例之(4):水仙花数的相关文章

经典C语言程序设计100例 -- C 和 Python 版 (06 - 10)

[06]格式化输出 题目:用*号输出字母C的图案. 思路:可先用'*'号在纸上写出字母C,再分行输出.如果输出图形较大,且有规律可循,可考虑使用循环. C 语言代码 int main() { const char *p = " **** \n" " ** ** \n" "** \n" "** \n" "** \n" " ** ** \n" " **** \n"; pr

黑马程序员——经典C语言程序设计100例

1.数字排列 2.奖金分配问题 3.已知条件求解整数 4.输入日期判断第几天 5.输入整数进行排序 6.用*号显示字母C的图案 7.显示特殊图案 8.打印九九口诀 9.输出国际象棋棋盘 10.打印楼梯并按条件打印笑脸 11.经典兔子问题 12.判断素数 13.水仙花数问题 14.正整数分解质因数 15.学习成绩划分 16.正整数求其最大公约数和最小公倍数 17.统计英文字母/空格/数字个数 18.求s=a+aa+aaa+aa...a的值 19.求解"完数" 20.球体自由落下物理问题

C语言程序设计100例之(9):生理周期

例9    生理周期 问题描述 人生来就有三个生理周期,分别为体力.感情和智力周期,它们的周期长度为 23 天.28 天和33 天.每一个周期中有一天是高峰.在高峰这天,人会在相应的方面表现出色.例如,智力周期的高峰,人会思维敏捷,精力容易高度集中.因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天.对于每个人,我们想知道何时三个高峰落在同一天. 对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间).你的任务是给定一个从当年第一天开始数的天数

C语言程序设计100例之(22):插入排序

例22  插入排序 问题描述 排序是计算机程序设计中的一种重要操作,它的功能是将一个数据元素或记录的任意序列,重新排列成一个以关键字递增(或递减)排列的有序序列. 排序的方法有很多,简单插入排序就是一种简单的排序算法. 插入排序的基本思想是顺序将一个待排序的记录按其关键字值的大小插入到一个有序的序列中,插入后该序列仍然是有序的. 简单插入排序是一种最简单的排序方法.它的排序过程为:先将待排序序列中第1个记录看成是一个有序的子序列,然后从第2个记录起依次逐个地插入到这个有序的子序列中去.这很像玩扑

C语言程序设计100例之(3): Cantor表

例3    Cantor表 题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1  1/2  1/3  1/4  …… 2/1  2/2  2/3  …… 3/1  3/2  …… 4/1  …… …… 现以z字型方法给上表的每项编号.方法为:第一项是1/1,然后是1/2.2/1.3/1.2/2.1/3.1/4.2/3……. 输入格式 整数N(1≤N≤10000000) 输出格式 表中的第N项 输入样例 7 输出样例 1/

C语言程序设计100例之(14):丑数

例14   丑数 问题描述 丑数是其质因子只可能是2,3或5的数.前10个丑数分别为1, 2, 3, 4, 5, 6, 8, 9, 10, 12.输入一个正整数n,求第n个丑数. 输入格式 每行为一个正整数n (n <= 1500),输入n=0结束. 输出格式 每行输出一个整数,表示求得的第n个丑数. 输入样例 1 2 50 0 输出样例 1 2 243 (1)编程思路. 根据丑数的定义,丑数从小到大排列的序列中的一个数应该是其前面某个数乘以2.3或者5的结果.因此,可以定义一个数组num[15

C语言程序设计100例之(13):最大子段和

例13        最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大.例如在序列2,-4,3,-1,2,-4,3中,最大的子段和为4,该子段为3,-1,2. 输入格式 第一行是一个正整数N,表示了序列的长度. 第二行包含N个绝对值不大于10000的整数Ai ,描述了这段序列. 输出格式 一个整数,为最大的子段和是多少.子段的最小长度为1. 输入样例 7 2 -4 3 -1 2 -4 3 输出样例 4 (1)编程思路. 可以从长度为n的数列的最左端(设为数组元素a[1]

C语言程序设计100例之(21):折半查找

例21  折半查找 问题描述 顺序查找是一种最简单和最基本的检索方法.其基本思想是:从检索表的一端(如表中第一个记录或最后一个记录)开始,逐个进行记录的关键字和给定值的比较.若某个记录的关键字和给定值比较相等,则查找成功:否则,若直至检索表的另一端(如最后一个记录或第一个记录),其关键字和给定值比较都不等,则表明表中没有待查记录,查找不成功. 顺序查找可以写成一个简单的一重循环,循环中依次将检索表(不妨设为数组a)中的元素与给定值比较,若相等,用break退出循环.算法描述为: for (i=0

经典C语言程序设计100例:1-10例

1. 有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? #include <stdio.h> main() { int i,j,k,n=0; for(i=1;i<5;i++) for(j=1;j<5;j++) for(k=1;k<5;k++) if(i!=j&&i!=k&&j!=k) { n++; printf("%d%d%d ",i,j,k); if(n%6==0){ printf("