- 注册时间
- 2007-12-27
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 43424
- 在线时间
- 小时
|
发表于 2016-11-4 19:15:01
|
显示全部楼层
第二个代码把上面代码输出简单处理一下,产生第一步筛选结果
- #include <stdio.h>
- #define IN "pp.out"
- #define BUFC 100000000
- #define MACC (8*BUFC)
- char buf[BUFC];
- #define BYTE(x) ((x)>>3)
- #define INDEX(x) ((x)&7)
- #define SET(x) (buf[BYTE(x)]|=1<<INDEX(x))
- #define GET(x) (buf[BYTE(x)]&(1<<INDEX(x)))
- int getd(int m){
- if(m%12==0)return 12;
- if(m%6==0)return 6;
- if(m%4==0)return 4;
- if(m%3==0)return 3;
- if(m%2==0)return 2;
- return 1;
- }
- int main()
- {
- int d,m,h,s;
- FILE *in=fopen(IN,"r");
- if(in==NULL){
- fprintf(stderr, "Fail to open input file\n");
- return -1;
- }
- while(fscanf(in,"%d,%d",&d,&m)==2){
- int md=getd(m);
- if(md>1&&d%md!=1)continue;//skip data non compatible with 1(mod 12)
- m/=md;d%=m;
- if(m==1){
- fprintf(stderr,"Error, all data is filtered away\n");
- return -1;
- }
- //find s so that d+sm=1(mod 12)
- for(s=0;s<12;s++){
- if((d+s*m)%12==1)break;
- }
- if(s==12){
- fprintf(stderr,"Logic error\n");
- return -1;
- }
- for(h=(d+s*m-1)/12;h<MACC;h+=m){
- SET(h);
- }
- }
- fclose(in);
- for(h=0;h<MACC;h++){
- if(GET(h)==0){
- printf("%d\n",h*12+1);
- }
- }
- return 0;
- }
复制代码 |
|