- 注册时间
- 2016-4-18
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 375
- 在线时间
- 小时
|
发表于 2017-1-22 10:49:48
|
显示全部楼层
举个例子:
试问方程1999a+1299b+1499c+2799d+2499e+3299f=2328450.在约束条件 a∈[0,607]、 b∈[0,534]、 c∈[0,60]、 d∈[0,660]、 e∈[0,100]、 f∈[0,209]下的整数解?
- #include <stdio.h>
-
- int main(int argc, char *argv[])
- {
- int *m=(int*)calloc(776151, sizeof(int));
- int a,b,c,d,e,f,sum,x,y,i;
- for(b=0;b<=534;b++){
- for(d=0;d<=660;d++){
- if(sum=433*b+933*d,sum<28576){continue;}
- else if(sum>776150){break;}
- m[sum]=b*1000+d;
- }
- }
- printf("求解完毕,请按任意键存为solutions.txt");
- getchar();
- FILE *fp=fopen("solutions.txt","w");
- printf("正在保存,这需要一些时间和数GB硬盘空间!");
- for(f=0;f<=209;f++){
- for(c=0;c<=60;c++){
- for(a=0;a<=607;a++){
- if((1999*a+1499*c+3299*f)%3!=0){continue;}
- for(e=0;e<=100;e++){
- if(sum=776150-833*e-(1999*a+1499*c+3299*f)/3,(sum<28576)||(m[sum]==0)){continue;}
- else if(sum>776150){break;}
- x=m[sum]/1000,y=m[sum]%1000;
- /*由于给出的b的取值x最大才534,因此连while循环也省了。
- while(x>0)
- {
- fprintf(fp,"%d,%d,%d,%d,%d,%d\n",a,x,c,y,e,f);
- x-=933,y+=433;i++;
- }
- */
- fprintf(fp,"%d,%d,%d,%d,%d,%d\n",a,x,c,y,e,f);
- }
- }
- }
- }
- fclose(fp);
- return 0;
- }
复制代码
保存需3GB硬盘空间,且保存速度由硬盘读写速度决定。如果不打印的话,只需要2秒就可以求解1亿五千万个解。仅在赛扬cpu上测试过。酷睿系列耗时不足1秒、 |
|