整除个数

来源:互联网 发布:淘宝香云纱 编辑:程序博客网 时间:2024/05/19 23:24

整除个数

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
1、2、3… …n这n(0<n<=1000000000)个数中有多少个数可以被正整数b整除。
输入
输入包含多组数据
每组数据占一行,每行给出两个正整数n、b。
输出
输出每组数据相应的结果。
样例输入
2 15 310 4
样例输出
212
来源
自编
上传者

mix_math



问题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=399


非正确代码1:

#include <iostream>  #include <stdio.h>   #include <string.h>  #include <math.h>  #include <vector>  #include <queue>  #include <stack>  #include <map>  #include <string>  #include <algorithm>  #include <iomanip>#define MAX 1000000000using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */bool mark[MAX];int main(int argc, char** argv) {/*freopen("file/input.txt","r",stdin);freopen("file/output.txt","w",stdout);*/int n,b;while(scanf("%d%d",&n,&b)!=EOF){memset(mark,false,sizeof(mark));int ans=0;for(int i=1;i<=n;i++){if(mark[i] == true){continue;}if(i % b == 0){  //找到一个可以整除的i,则将之后i的倍数的数全部标记为可以整数,//并累加的结果中 mark[i]=true;ans++;for(int j=2*i;j>0 && j<=n;j+=i){mark[j]=true;ans++;}}}printf("%d\n",ans);}return 0;}
错误:MemoryLimitExceeded

在标记时候申请了很大一块空间进行标记数是否被检查过。


改进代码:

#include <iostream>  #include <stdio.h>   #include <string.h>  #include <math.h>  #include <vector>  #include <queue>  #include <stack>  #include <map>  #include <string>  #include <algorithm>  #include <iomanip>#define MAX 1000000000using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char** argv) {/*freopen("file/input.txt","r",stdin);freopen("file/output.txt","w",stdout);*/int n,b;while(scanf("%d%d",&n,&b)!=EOF){int ans=0;for(int i=b;i<=n;i+=b){ans++;}printf("%d\n",ans);//printf("%d\n",n/b);}return 0;}

错误:TimeLimitExceeded

改进第一个超出内存错误时发现在遍历时,可以整除的一定是b的倍数。因 此直接对n以内的b的倍数进行统计即可。

但是却超时了。 忽然发现其实直接n/b就是n内可以整除b的个数。为什么呢?希望知道的能解惑一下,非常感谢!q q 1 2 2 51 5 4 2 9 6

#include <iostream>  #include <stdio.h>   #include <string.h>  #include <math.h>  #include <vector>  #include <queue>  #include <stack>  #include <map>  #include <string>  #include <algorithm>  #include <iomanip>#define MAX 1000000000using namespace std;/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char** argv) {/*freopen("file/input.txt","r",stdin);freopen("file/output.txt","w",stdout);*/int n,b;while(scanf("%d%d",&n,&b)!=EOF){//int ans=0;//for(int i=b;i<=n;i+=b){//ans++;//}//printf("%d\n",ans);printf("%d\n",n/b);}return 0;}


原创粉丝点击