一、无重复的三位数
编程求:用1.2.3.4共4个数字组成的互不相同且无重复数字的三位数以及个数
※1)枚举、排列组合问题
2)效率改进点:依次枚举三位数字(三层循环),若前两位相同则无需进入第三层循环
源代码:
#include <stdio.h>
#include <math.h>
int main()
{
int i,j,k;
int num=0;
for(i=1;i<=4;i++)
{
for(j=1;j<=4;j++)
{
for(k=1;k<=4 && i!=j;k++)
{
if(i!=k && j!=k)
{
printf("%d%d%d ",i,j,k);
num++;
if(num%8==0) //控制每8个数字换一行
printf("\n");
}
}
}
}
printf("能组成的三位数个数为:%d\n",num);
return 0;
}
程序截图:
二、勾股数
求100以内的所有勾股数(即能构成直角三角形三条边的三个正整数)
※1)根据勾股定理,a^2+b^2=c^2,且要求a<b<c,a+b>c,a+c>b,b+c>a
2)枚举a b c三个数,输出符合要求的组合
源代码:
法一:依次遍历abc,满足a<b<c
#include <stdio.h>
int main()
{
int a,b,c;
int num=0;
for(a=1;a<=100;a++)
{
for(b=a+1;b<=100;b++)
{
for(c=b+1;c<=100;c++)
{
if(a*a+b*b==c*c && a+b>c && a+c>b && b+c>a)
{
printf("%4d-%4d-%4d ",a,b,c);
num++;
if(num%4==0)
printf("\n");
}
}
}
}
printf("勾股数总对数:%d\n",num);
return 0;
}
法二:每次循环求出a^2+b^2,然后将该数的平方根赋给c,判断c^2是否等于a^2+b^2(因为a^2+b^2的平方根不一定为整数,只有c^2=a^2+b^2时才可判断符合条件)
#include <stdio.h>
#include <math.h>
int main()
{
int a,b,c,pow;
int num=0;
for(a=1;a<=100;a++)
{
for(b=a+1;b<=100;b++)
{
pow=a*a+b*b;
c=(int)sqrt(pow);
if(c*c==a*a+b*b && a+b>c && a+c>b && b+c>a && c<=100)
{
printf("%d %d %d\n",a,b,c);
num++;
}
}
}
printf("勾股数总对数:%d\n",num);
return 0;
}
程序截图:
三、阿姆斯特朗数
如果一个整数等于其各个数字的立方和,则称该数为“阿姆斯特朗数”(例:153=1^3+5^3+3^3,是一个“阿姆斯特朗数”)。输入n,编程求n以内的所有“阿姆斯特朗数”
※分离各位数字:求余与整除的综合运用
源代码:
#include <stdio.h>
#include <math.h>
int main()
{
int i,t,sum;
int n;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
t=i,sum=0;
while(t>0)
{
sum+=(pow((t%10),3));
t/=10;
}
if(i==sum)
printf("%d\n",i);
}
}
return 0;
}
程序截图:
四、高次方程的尾数
求x的y次方的最后三位数
※1)考虑精度问题及题目要求,无需将x的y次方具体值求出
2)乘积最后三位的值至于乘数和被乘数后三位有关,因此在计算下一次乘积时,只需用上一次的结果后三位(某数 mod 1000)
源代码:
#include <stdio.h>
int main()
{
int i,x,y;
int last=1; //last保存累乘结果
while(scanf("%d %d",&x,&y)!=EOF)
{
for(i=1;i<=y;i++)
{
last=last*x%1000; //下一次相乘前先截取last的后三位再相乘
printf("%d\n",last);
}
printf("The last three digits are: %d\n\n",last);
}
return 0;
}
程序截图: