蓝桥杯2013年省赛c/c++A组题2(排它平方数)

题目标题: 排它平方数

小明正看着 203879 这个数字发呆。 原来,203879 * 203879 = 41566646641,这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!

再归纳一下筛选要求:

  1. 6位正整数

  2. 每个数位上的数字不同

  3. 其平方数的每个数位不含原数字的任何组成数位

答案是一个6位的正整数。

请通过浏览器提交答案。

注意:只提交另一6位数,题中已经给出的这个不要提交。

注意:不要书写其它的内容(比如:说明性的文字)。

参考答案: 639172

运行结果

解题C语言代码如下:

/***********************************************************************************************
 ***                 蓝桥杯2013年省赛c/c++A组题2(排它平方数)                                 ***
 ***********************************************************************************************
 *                                                                                             *
 *                 Project Name : -----------------                                            *
 *                                                                                             *
 *                    File Name : T2排它平方数.c                                                *
 *                                                                                             *
 *                   Start Date : 2020-08-05                                                   *
 *                                                                                             *
 *                  Last Update : 2020-08-05 [JYH]                                             *
 *                                                                                             *
 *---------------------------------------------------------------------------------------------*
 * Functions:  																				   * 
 *   main -- 主函数,寻找排它平方数	                            							   *
 *   isDifferent -- 判断数组中的数字是否各不相同                                                 *
 *   digital_split -- 数字拆分                                                                 *
 *   number_of_digits -- 计算数字位数                                                           *
 *   pow1 -- 幂函数                                                                            * 
 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int isDifferent(int* data, int n); 
void digital_split(long long num, int dig, int* sn);
int number_of_digits(long long num); 
long long pow1(int m, int n);


/***********************************************************************************************
 * main -- 主函数,寻找排它平方数	                                                               *
 *                                                                                             *
 * INPUT:   none                                                                               *
 *                                                                                             *
 * OUTPUT:  none								                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
int main()
{
	long long a=99999, aa;
	int *data1, *data2; 
	int dig;
	int i,j;
	while(a<999999){
		a++;
		data1 = (int *)malloc(6 * sizeof(int));
		digital_split(a, 6, data1);
		if(!isDifferent(data1,6)) continue;
		aa = a*a;
		dig = number_of_digits(aa);
		data2 = (int *)malloc(dig * sizeof(int));
		digital_split(aa, dig, data2);
		for(i=0; i<6; i++){
			for(j=0; j<dig; j++){
				if(data1[i]==data2[j]){
					break;
				}
			}
			if(j!=dig){
				break;
			}
		}
		if(i==6){
			printf("%lld,\t\t",a);
			printf("%lld * %lld = %lld\n",a,a,aa);
		}
	}
}


/***********************************************************************************************
 * isDifferent -- 判断数组中的数字是否各不相同                                                   *
 *          none                                                                               *
 *                                                                                             *
 * INPUT:   data -- 需判断的数组     														   * 
 *          n    -- 数组中元素个数                                                              *
 *                                                                                             *
 * OUTPUT:  1  -- 数组中元素各不相同    	                                                       *
 * 			0  -- 数组中至少存在两个元素大小相同                                                  * 
 *                                                                                             *
 * WARNINGS: none                                                                              *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
int isDifferent(int* data, int n)
{
	int i,j;
	for(i=0; i<n; i++){
		for(j=i+1; j<n; j++){
			if(data[i]==data[j]) return 0;
		}
	}
	return 1;
}


/***********************************************************************************************
 * digital_split -- 数字拆分                                                                   *
 *                                                                                             *
 *    对给定数字进行拆分,将每一位存放在数组sn中, sn[0]为个位,sn[1]为十位……以此类推                * 
 *    注:动态申请一维数组的方法                                                                 *
 *        int *data;                                                                           *
 *        data = (int *)malloc(dig * sizeof(int));                                             *
 *        其中:dig为数组位数,int为数组内变量的类型                                              *
 *                                                                                             *
 * INPUT:   num  -- 待拆分数字        														   * 
 *          dig  -- 待拆分数字的位数                                                            *
 *          sn   -- 拆分后每一位存放在数组sn中                                                   *
 *                                                                                             *
 * OUTPUT:  none    			 			                                                   *
 *                                                                                             *
 * WARNINGS: 最大可拆18位数字                                                                   *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
void digital_split(long long num, int dig, int* sn)
{
	int i;
	for(i=0; i<dig; i++){
		sn[i] = num/pow1(10,i)%10;
	}
}


/***********************************************************************************************
 * number_of_digits -- 计算数字位数                                                             *
 *                                                                                             *
 *    计算数字位数,比如num = number_of_digits(1234) , 输出num=4                                 *
 *                                                                                             *
 * INPUT:   digits  -- 数字        															   * 
 *                                                                                             *
 * OUTPUT:  数字位数    			 			                                                   *
 *                                                                                             *
 * WARNINGS: 最大可判断18位数字                                                                 *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
int number_of_digits(long long digits)
{
	int i;
	for(i=17; i>0; i--){
		if(digits/pow1(10,i)!=0) break;
	}
	return i+1;
}


/***********************************************************************************************
 * pow1 -- 幂函数	                                                                           *
 *                                                                                             *
 *    计算幂函数的值,如:pow(10,5)表示10^5                                                      *
 *                                                                                             *
 * INPUT:   m     -- 底数        															   *
 *          n     -- 指数                                                                      *
 *                                                                                             *
 * OUTPUT:  m的n次方(m^n)			 			                                               *
 *                                                                                             *
 * WARNINGS:   none                                                                            *
 *                                                                                             *
 * HISTORY:                                                                                    *
 *   2020-08-05 JYH : Created.                                                                 *
 *=============================================================================================*/
long long pow1(int m, int n)
{
	int i;
	long long t=1;
	for(i=0; i<n; i++){
		t *= m;
	}
	return t;
}

posted on 2020-08-07 14:54  last_point  阅读(151)  评论(0编辑  收藏  举报

导航