【项目1-小明借书】
小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。
代码:
/*小明借书*/
#include <stdio.h>
int main()
{
int a,b,c,i=0;
for(a=1;a<=5;a++)
for(b=1;b<=5;b++)
for(c=1;c<=5;c++)
{
if(a!=b&&b!=c&&c!=a)
{
i++;
printf("%d %d %d\n",a,b,c);
}
}
printf("一共有%d种借法\n",i);
return 0;
}
【项目2-水仙花数】
对于三位数字,若各位数字立方和等于该数,该数就是水仙花数。如153:153=13+53+33
代码:
/*水仙花数*/
#include <stdio.h>
int main()
{
int s,q,w,e;
for(s=100;s<1000;s++)
{
q=s/100;
w=(s/10)%10;
e=s%10;
if(s==q*q*q+w*w*w+e*e*e)
{
printf("%d\n",s);
}
}
return 0;
}
这是穷举100-999的数判断是否是水仙花数,也可以穷举3个数字,再组合成一个三位数,判断和是否等于该三位数
代码:
/*水仙花数*/
#include <stdio.h>
int main()
{
int s,q,w,e;
for(q=1;q<=9;q++)
for(w=0;w<=9;w++)
for(e=0;e<=9;e++)
{
s=q*100+w*10+e;
if(s==q*q*q+w*w*w+e*e*e)
printf("%d\n",s);
}
return 0;
}
现在我们拓展下思维,我们改变下题目求任意范围内所有的水仙花数
水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)
代码:
/*水仙花数*/
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,p,f,x,m,s,sum,d,g;
sum=0;
p=0;
f=0;
printf("请输入超过100的任意范围数值(如x-y):");
scanf("%d-%d",&a,&b);
for(x=a;x<=b;x++)
{
m=x;
p=0;
while(m>0)//求出幂的值,3位数幂=3,4位数幂=4,以此类推
{
s=m%10;
m=m/10;
p++;
}
m=x;
sum=0;
while(m>0)
{
s=m%10;
d=1;
for(g=1;g<=p;g++)//这里大家要注意,pow函数是double,会丢失数据,刚刚开始用pow的时候5的3次方被计算成了124,切记切记
{
d*=s;
}
sum+=d;
m=m/10;
}
if(sum==x)
{
printf("%d\n",x);
f++;
}
}
printf("该范围一共有%d个水仙花数",f++);
return 0;
}
这里讲下思路分析,输入一个范围,我们首先判断当前循环的数是几位数的,即n位数那我们就要计算机求出n的值也就是我们所需要的幂的值
然后分别求了该数的每位数的n次幂的值相加 判断是否等于原数即可
这里尤其注意我们求int类型尽量不要用pow pow的返回值是double型数据,会丢失数据