整除的尾数

此博客链接: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("\n"); } 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\n", 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("\n"); 
    }
    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("\n");
    }
    return 0;
}

 

 
posted @ 2020-02-25 19:32  萍2樱释  阅读(363)  评论(4编辑  收藏  举报