07、找出1-99之間的同構數


找出1-99之間的同構數

找出1-99之間的同構數

程序代碼如下:

/*
    2017年3月12日12:58:35
    功能;找出1-99之間的同構數
*/
    #include"stdio.h"

    int main()
    {
        for (int i = 1; i < 100; i++)
        {
            int Power_i = i *i;
            if (i < 10)                                            
            {
                int a = Power_i %10;
                if (i == a)
                {
                    printf("%2d 是 %4d 的同構數\n",i,Power_i);
                }
            }
            else if(i >= 10 && i < 100)
            {
                int b = Power_i % 100;
                if (i == b)
                {
                    printf("%2d 是 %4d 的同構數\n", i, Power_i);
                }
            }
        }
    }
    
/*
    總結:
    1、同構數的特點是在於10以內的數,其平方數是不大於100的兩位數,故取余保留一位數的方式是(%10)
       而大於10小於100的數,其平方取余保留平方數后兩位的方式(%100)
    2、在VC++6.0中顯示的結果:
    ————————————————————
     1 是    1 的同構數
     5 是   25 的同構數
     6 是   36 的同構數
    25 是  625 的同構數
    76 是 5776 的同構數
    ————————————————————
        
*/

 

以下是借鑒YuJar博友(網易博客)的優秀的算法思想:

# include<stdio.h>

void main(void)
{
	int digit = 0;								//記錄同構數的位數
	int square = 0;								//記錄平方值
	int rightvalue = 0;							//平方數右端的值
	int t = 0, times ;							//t是臨時變量,(循環期間會重置)

	for(int i=1; i<=10000; i++)
	{
		digit = 0 ;							//每一次循環,之前的數據(位數、平方數右端的值)都會被重置
		rightvalue = 0;
		times = 1;							//times = 1此賦值語句很關鍵
		t = i;
		square = i * i;
		while(t)							//此處不用i作判斷,而是將i的值賦給一個臨時變量t,是因為需要找出數據的特性,但是在做一些運算之后數據會改變,故用臨時變量來參與運算
		{
			t /= 10;
			digit++;
		}
		while(digit--)
		{
			rightvalue += (square%10)*times;   //在while語句中,每循環一次times的值都乘以10,times = 1表示此次循環計算個位上數據,times = 10表示此次循環計算十位上數據,依次下去...
			square /= 10;						//	square/10取商上的數值,square%10取余數的數值。
			times *= 10;
		}
		if(i == rightvalue)
		{

			printf("%d * %d = %d\n", i, i, i*i);
		}

	}
}

/*
總結思路:
	1.求出1-10000之間每個數的位數(即這個數是幾位數)
	2.再求出每個數的平方值,提取出最右端對應位數的數值出來(如369是個三個數,它的平方是136161,用取模%法提取出最右三位數字161)
	3.最好對比i與右端數是否相等,相等即為同構數

	*****VC++6.0中執行結果如下*********
	1 * 1 = 1
	5 * 5 = 25
	6 * 6 = 36
	25 * 25 = 625
	76 * 76 = 5776
	376 * 376 = 141376
	625 * 625 = 390625
	9376 * 9376 = 87909376
	***********************************
*/

優化算法:

/* 
   1、多重if判定比上面多重循環要更優一點。 
    2、不過前面的算法太復雜,但更大的數值判定不須再增加條件去,改i的范圍就行 
    3、而這個數值每多一位數要加一重判定,好處是簡單易懂。
   4、if...else語句的特點是多種情況中在每一次循環時只有一種情況滿足條件,每一種情況相互獨立,執行完后進入下一次循環。
*/  
/* 
思路: 
    1.先明確i數值的位數,再用i平方的值(i*i)取余 
    2.對i的平方值取余的位數等同i這個數值的位數 
        (如i=123為3位數,123*123=15129,對15129取三個余數,即15129%1000 = 129) 
    3.對比i == (i*i)%10 (位數每增加1位,%取余位相應增加) 
*/  
# include<stdio.h>  
  
void main(void)  
{  
    for(int i = 1; i<10000; i++)
	{  
        if(i>=1 && i<=9)
		{												//i是1位數時  
            if(i == (i*i)%10)							//(注意*的運算優先級大於%,后面都不加括號了)  
                printf("%d * %d = %d\n", i, i, i*i);  
        }  
        else if(i>=10 && i<=99)
		{												//i是2位數時  
            if(i == i*i%100)      
                printf("%d * %d = %d\n", i, i, i*i);  
        }  
        else if(i>=100 && i<=999)
		{												 //i是3位數時  
            if(i == i*i%1000)  
                printf("%d * %d = %d\n", i, i, i*i);  
        }  
        else if(i>=1000 && i<=9999)
		{												//i是4位數時  
            if(i == i*i%10000)  
                printf("%d * %d = %d\n", i, i, i*i);  
        }  
    }  
}  

  

  

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM