zoukankan      html  css  js  c++  java
  • 整除的尾数

    此博客链接:https://i-beta.cnblogs.com/posts/edit-done;postId=12363339

    整除的尾数(110min)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099

    Problem Description
    一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
     
    Input
    输入数据有若干组,每组数据包含二个整数a,b(0<a<10000, 10<b<100),若遇到0 0则处理结束。
     
    Output
    对应每组数据,将满足条件的所有尾数在一行内输出,格式见样本输出。同组数据的输出,其每个尾数之间空一格,行末没有空格。
     
    Sample Input
    200 40
    1992 95
    0 0
     
    Sample Output
    00 40 80
    15
    题解:
            思路:对给定的数乘以100,然后后面加上0到99的数,输出满足能被整除的数。
            注意:1.对于一个输出样例,除了第一个数,每个输出的数前面都有一个空格。
                       2.对于输出是小于10的整数前面多输出一个0。
    代码如下:
    代码1:
    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
        int n;
        int m;
        while (~scanf("%d %d",&n,&m)&&(m||n))
        {
            int i;
            int j;
            int arr[100];
            int k=0;
            int rev=n*100;
            for(i=0;i<=9;i++)
            {
                for(j=0;j<=9;j++)
                {
                    if(i==0)
                    {
                        if((rev+j)%m==0)
                             arr[k++]=j;
                    }
                    else
                        if((rev+i*10+j)%m==0)     
                        {
                            arr[k++]=i*10+j;    
                        }    
                }
            }
            for(i=0;i<k-1;i++)
            {
                if(arr[i]<=9)
                    printf("0");
                 printf("%d ",arr[i]);
            }
    if(arr[i]<=9)
                 printf("0");
    printf(
    "%d",arr[k-1]); printf(" "); } return 0; }

    针对代码1,做出了如下的优化:

    1.循环的优化:代码1是二重循环,时间复杂度为O(n*n),修改后的代码是一重循环,时间复杂度为O(n),优化后的代码降低了时间复杂度,代码运行时间更少。

    2.输出的优化:代码1考虑了输出个位数要再前面补0的情况,优化后的代码,输出使用两位占位符,不需要判断输出个位情况,优化后,不需要每次输出都判断是否是个位情况,减少了代码运行时间。

    优化代码:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
        int n;
        int m;
        while (~scanf_s("%d %d", &n, &m) && (m || n))
        {
            int i;
            int arr[100] = { 0 };
            int k = 0;
            int rev = n * 100;
            for (i = 0; i < 100; i++)
            {
                if ((rev + i) % m == 0)
                    arr[k++] = i;
            }
            for (i = 0; i < k - 1; i++)
                printf("%02d ", arr[i]);
            printf("%02d
    ", arr[k - 1]);
        }
        return 0;
    }

    代码2:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
        int n;
        int m;
        while (~scanf("%d %d",&n,&m)&&(m||n))
        {
            int i;int rev=n*100;
            int sign=0;//标记是否是第一个输出的数 
            for(i=0;i<=99;i++)
            {    
                if((rev+i)%m==0)//能整除 
                {
                    if(sign==0)//如果是第一个数 
                    {
                        if(i<=9)//小于0的数前面要多输出一个0 
                            printf("0");    
                    }
                     else if(sign==1)//如果不是第一个数 
                    {
                         printf(" ");//要多输出一个空格 
                         if(i<=9)
                            printf("0");
                    }
                    printf("%d",i);    
                    sign=1;
                }
                
            }
            printf("
    "); 
        }
        return 0;
    }

    针对代码2,做出了如下的优化:

    1.变量定义的优化:代码2多定义一个变量rev来计算n乘以100后的值,优化后的代码,直接使用n=n*100没有重新定义变量,节省内存。

    2.输出的优化:代码1考虑了输出个位数要再前面补0的情况,优化后的代码,输出使用两位占位符,不需要判断输出个位情况,优化后,不需要每次输出都判断是否是个位情况,减少了代码运行时间。

    3.全局变量的优化:代码2在循环外定义的变量,优化后,在循环内部定义变量,节省空间,能局部变量,不用全局变量。

    优化代码:

    #include<stdio.h>
    #include<math.h>
    #include<stdlib.h>
    #include<string.h>
    int main()
    {
        int n;
        int m;
        while (~scanf_s("%d %d", &n, &m) && (m || n))
        {
            n *= 100;
            int sign = 0;//标记是否是第一个输出的数 
            for (int i = 0; i <= 99; i++)
            {
                if ((n + i) % m == 0)//能整除 
                {
                    if (sign == 1)//如果不是第一个数 
                        printf(" ");//要多输出一个空格 
                    printf("%02d", i);
                    sign = 1;//输出一次的标记
                }
            }
            printf("
    ");
        }
        return 0;
    }
     
  • 相关阅读:
    OpenCV 2.4.9
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    吐槽一下CSDN的封停审查机制
    【课程分享】Oracle数据库系统project师
    Html的空格显示
    iOS UIWebView 访问https 绕过证书验证的方法
    Java实现 蓝桥杯VIP 算法训练 整除问题
    Java实现 蓝桥杯VIP 算法训练 数位分离
    Java实现 蓝桥杯VIP 算法训练 薪水计算
    Java实现 蓝桥杯VIP 算法训练 完数
  • 原文地址:https://www.cnblogs.com/ping2yingshi/p/12363339.html
Copyright © 2011-2022 走看看