藍橋杯——趣味整數問題二(2017.1.31)

1、無重複的三位數c++

        編程求:用1.2.3.4共4個數字組成的互不相同且無重複數字的三位數以及個數git

        ※1)枚舉、排列組合問題編程

            2)效率改進點:依次枚舉三位數字(三層循環),若前兩位相同則無需進入第三層循環code

源代碼:blog

#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;
}

程序截圖:



2、勾股數three

        求100之內的全部勾股數(即能構成直角三角形三條邊的三個正整數)it

        ※1)根據勾股定理,a^2+b^2=c^2,且要求a<b<c,a+b>c,a+c>b,b+c>aio

            2)枚舉a b c三個數,輸出符合要求的組合ast

源代碼:class

法一:依次遍歷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;
}

程序截圖:



3、阿姆斯特朗數

        若是一個整數等於其各個數字的立方和,則稱該數爲「阿姆斯特朗數」(例: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;
}

程序截圖:



4、高次方程的尾數

        求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;
}

程序截圖: