蓝桥杯——趣味整数问题二(2017.1.31)

一、无重复的三位数

        编程求:用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;
}

程序截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值