1. 程式人生 > >程式設計找出不同的四位平方數對,它們由相同的數字構成

程式設計找出不同的四位平方數對,它們由相同的數字構成

問題重述:

[ 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

程式設計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為正整數,表示第