藍橋杯2013年省賽c/c++A組題2(排它平方數)
阿新 • • 發佈:2020-08-07
題目標題: 排它平方數
小明正看著 203879
這個數字發呆。 原來,203879 * 203879 = 41566646641
,這有什麼神奇呢?仔細觀察,203879
是個6位數,並且它的每個數位上的數字都是不同的,並且它平方後的所有數位上都不出現組成它自身的數字。具有這樣特點的6位數還有一個,請你找出它!
再歸納一下篩選要求:
-
6位正整數
-
每個數位上的數字不同
-
其平方數的每個數位不含原數字的任何組成數位
答案是一個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; }