1. 程式人生 > 實用技巧 >藍橋杯2013年省賽c/c++A組題2(排它平方數)

藍橋杯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;
}