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 的同构数
",i,Power_i);
                }
            }
            else if(i >= 10 && i < 100)
            {
                int b = Power_i % 100;
                if (i == b)
                {
                    printf("%2d 是 %4d 的同构数
", 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
", 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
", i, i, i*i);  
        }  
        else if(i>=10 && i<=99)
		{												//i是2位数时  
            if(i == i*i%100)      
                printf("%d * %d = %d
", i, i, i*i);  
        }  
        else if(i>=100 && i<=999)
		{												 //i是3位数时  
            if(i == i*i%1000)  
                printf("%d * %d = %d
", i, i, i*i);  
        }  
        else if(i>=1000 && i<=9999)
		{												//i是4位数时  
            if(i == i*i%10000)  
                printf("%d * %d = %d
", i, i, i*i);  
        }  
    }  
}  

  

  

  

  

原文地址:https://www.cnblogs.com/wxt19941024/p/6537686.html