整除的尾数
此博客链接: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; }
出来混总是要还的