zoukankan      html  css  js  c++  java
  • 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);  
            }  
        }  
    }  
    

      

      

      

      

  • 相关阅读:
    让服务器可以下载apk和ipa文件
    MVC第一次访问比较慢的解决方案
    [C#]记录程序耗时的方法【转发】
    uploadify上传带参数及接收参数的方法
    uploadify上传之前判断一个input输入框是否为空
    jgGrid获得的id值是主键的id而不是jqGrid的行号值
    jqGrid删除多行数据问题
    Linux下的微秒级定时器: usleep, nanosleep, select, pselect
    Linux平台延时之sleep、usleep、nanosleep、select比较
    Linux 高精確的時序(sleep, usleep,nanosleep) from:http://blog.sina.com.cn/s/blog_533ab41c0100htae.html
  • 原文地址:https://www.cnblogs.com/wxt19941024/p/6537686.html
Copyright © 2011-2022 走看看