程式設計找出不同的四位平方數對,它們由相同的數字構成
問題重述:
[ 1024,2401; 1089,9801; 1296,2916; 1296,9216; 1369,1936; 1764,4761; 2916,9216; 4096,9604 ]
上述數對是1000~9999 的平方數,他們4個位數上所用到的數字是一樣的。
問題分析:
1000~9999所有的平方數對應的平方根範圍是32~99,二重遍歷32~99,找出符合規則的數對{x,y}(x != y),列印。
虛擬碼的框架可以簡化為:
i : 32 -> 99
j : i+1 -> 99
//相應的規則符合即列印i ,j
一個錯誤的想法:
按照上述虛擬碼框架,找出規則為解題的關鍵:
最初的錯誤想法是:
將 平方數 的4位數每一位數的和&積(除去0)求出來,都相等的即為符合的規則
結果:
多出來這樣的數對:
{ 35(1225) , 71(5041) }
{ 47(2209) , 70(4900) }
{ 67(4489) , 94(8836) }
後來仔細考慮發現 忽略了4平方位數的合數位的質因數或者因數 可能在另一4位平方數上佔據多位(有點繞口,但看上述三個特例就清楚了)
為了交流學習,錯誤程式碼如下:
#include <stdio.h> int NumberSum(int num) { int i=4; int sum =0; while (i--) { sum += num%10; num /= 10; } return sum; } int NumberAdd(int num) { int i=4; int sum = 1; int temp; while (i --) { temp = num % 10; if(temp != 0) sum *= temp; num /= 10; } return sum; } int main() { int i; int j; int numI; int numJ; int numI1; int numJ1; for (i = 32 ;i <= 99 ; i ++) //int key = -1; { numI = NumberSum(i*i); numI1 = NumberAdd(i*i); for(j = i + 1; j<= 99; j++) { numJ = NumberSum(j*j); numJ1 = NumberAdd(j*j); if (numI == numJ) { if(numI1 == numJ1) { printf("i = %d j = %d\r\n",i,j); } } } } return 0; }
正確的思路:
將平方數的每一位放入陣列,並對陣列按升序或者降序排序後,對兩個陣列按位比較。
程式碼如下:
#include <iostream> using namespace std; int cmp(const void*a,const void*b) { return *(int*)a -*(int*)b; } //將每一位數字存入陣列 void getNumber(int num,int a[]) { int i = 4; while (i) { a[--i] = num % 10; num /= 10; } } //按位比較兩個陣列的每一位數字 int Compare(int a[],int b[]) { int i; int count = 0; for (i=0;i<4;i++) { if (a[i]==b[i]) { count ++; } else continue; } if(count == 4) return 1; else return 0; } int main() { int i; int j; int a[4]; int b[4]; for (i = 32 ;i < 100; i++) { getNumber(i*i,a); qsort(a,4,sizeof(a[0]),cmp);//排序 for(j= i+1 ;j< 100; j++) { getNumber(j*j,b); qsort(b,4,sizeof(b[0]),cmp);//排序 if(Compare(a,b)) { cout << "{"<<i*i<<","<<j*j<<"}"<<endl; } } } return 0; }
執行結果如下:
相關推薦
程式設計找出不同的四位平方數對,它們由相同的數字構成
問題重述: [ 1024,2401; 1089,9801; 1296,2916; 1296,9216; 1369,1936; 1764,4761; 2916,9216; 4096,9604 ] 上述數對是1000~9999 的平方數,他們4個位數上所用到的數字是一樣的。
5.題目: 一個數如果恰好等於它的因子之和,這個數被成為”完數”,例如:6=1+2+3.請程式設計找出1000以內的完數
#include <stdio.h> int main() { int i; int j; int sum=0; int temp; for(i = 1;i <= 1000;i++) { temp = i; for(j = 1; j <=
程式設計找出1000以內的完數,並按下面格式輸出因子:6 its factors are 1 2 3
void is_Perfectnumber(int number) //判斷完數並輸出 { int i = 0; int j = 0; int sum = 0; int
找出重複兩次的數--有且只有一個數字重複兩次,其餘都不重複
問題描述:數字範圍是0-99的整數,給出101個整數,其中只有一個是重複兩次的數,找出這個數 分析:如果是有序的話,遍歷一次就可以找出 方法一 :先排序,再遍歷,遍歷超過一次 方法二 :只是排序,排序過程中對於元素相等這一特殊情況拿出來判斷,直接返回相等的這個元素, 方法三 :使用亦或運
題目:一個數如果恰好等於它的因子之和,這個數就稱為"完數"。例如6=1+2+3.程式設計找出1000以內的所有完數。
兩個易錯點:1.sum應該在每次內迴圈結束之後進行初始化。2.對因子之和與數本身的判斷應該在內迴圈結束後。 public class Test9 { public static void main(String[] args) { int sum,i,j; for(i
c語言 程式設計找出1000之內的所有完數
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興! 一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6的因子為1,2,3,6=1+2+3,因此6是“完數”。程式設計找出1000之內的所有完數。程式:#i
【程式19】 題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6 = 1+2+3.程式設計 找出1000以內的所有完數。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> /* 題目:一個數如果恰好等於它的因子之和,這個數就稱為“完數”。例如6 = 1+2+3.程式設計 找出1000以內的所有完數。 */ int main(void){ int num
一個數如果恰好等於它的因子之和,這個數就稱為"完數"。例如6=1+2+3.程式設計找出1000以內的所有完數。
for j in range(2,1001): k = [] for i in range(1,j): if j % i == 0: k.append(i) if sum(k)==
程式設計找出1000之內的所有完數,並輸出其因子
#include<stdio.h> void main() { int count=0,i,j; for(i=1;i<=1000;i++) { int
程式設計找出1000以內的所有完數
一個數如果恰好等於它的因子之和,這個數就稱為“完數”(因子不包括它本身)。例如6=1+2+3. 找出1000之內的完數程式碼: #include <stdio.h> int
作業題:輸入4個整數,找出其中最大的數。用一個函數來實現. 分別使用結構化方法和函數嵌套的方法。
system 是否 進行 如果 div 使用 clu 函數 整型 之前在main()函數中的思路是: #include <iostream> using namespace std; int main(){ //求四個數中最大的數? /
輸出4個整數,找出其中最大的數。用函數嵌套調用來處理
函數返回值 integer return 另一個 pos 結果 圖片 個數 數值 /* p183 例7.5 輸出4個整數,找出其中最大的數。用函數嵌套調用來處理 解題思路:這個問題並不復雜,完全可以只用一個主函數就可以得到結果。在main函數中調用max4函數,max4函數
java筆試題:找出3~999的水仙花數的三種實現方式
style col 展示 ava num get 實現 sys pack 第一種方式: package test; public class Exsercise { public static void main(String[] args) {
python兩個列表比較,找出不同的刪掉
比較兩個列表,刪除不一樣,簡單方法就是減法,得出不一樣的列表,迴圈刪就可以了 a = [1,2] b=[3,4] #用減法 set(a) - set(b) #結果: set([1, 2])
C語言筆記19--找出第n大的數
這是一道面試的題目,題目大意是:找出陣列中第n大的數,例如:輸入1,則返回最大的值。 有一些極端情況是,例如找出第二大的數,如果陣列全都是同一個數,即沒有第二大的數。這題目我採用了冒泡法,因為每一次冒泡,都可以找出剩下數中的最大值,每次找出的最大值與陣列中最大值比較,相等即說明都是最大值,不等即
找出長度為n的數組中重復的一個數字(數字範圍在0~n-1) 不采用hashmap
static 一個 str for each light println 循環 pub 要求不采用hashmap public static void main(String[] args) { int[] nums = { 1, 2, 4, 3, 0 }; S
字串中找出連續最長的數字串
讀入一個字串str,輸出字串str中的連續最長的數字串 輸入描述: 個測試輸入包含1個測試用例,一個字串str,長度不超過255。 輸出描述: 在一行內輸出str中裡連續最長的數字串。
演算法習題61:找出陣列中兩個只出現一次的數字:一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次
找出陣列中兩個只出現一次的數字 題目:一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。 請寫程式找出這兩個只出現一次的數字。要求時間複雜度是 O(n),空間複雜度是 O(1)。 --------------------------------------------
java 實現從無序陣列中 找出第k大的數, 無序陣列充許有重複元素
要求找出第幾名的元素是什麼(找出B[i]的值)? 找出第k名的元素的值。 先從A中隨機一個下標index1, 然後進行一趟快速排序等到新陣列A1,排完了就知道index1對應的元素在A1中的新下標index2. 如果k等於index2,則A1[index2]就是要找的值。 如果 k小於in
1.不同進位制數之間的相互轉換
我們比較常用的數制有十進位制、二進位制、八進位制和十六進位制。二進位制就是逢二進一,每位都是小於二的數,其他進位制類推。計算機儲存資料使用的是二進位制編碼。 對於一個R進位制的數X來說,其值可以通過下面的公式算出來:,前面是整數部分,後面是小數部分,m,n為正整數,表示第