AB计算器
| ||||||||
程序文件名: ab.cpp/ab.pas/...
| ||||||||
南开ACM协会的一位元老设计了一种特殊的计算器。这个计算器只有四个键(A,B,+,-)。
计算器显示的数值开始为c, 按一下"+"然后按一下"A",计算器显示的数值增加 a 按一下"-"然后按一下"A",计算器显示的数值减少 a 按一下"+"然后按一下"B",计算器显示的数值增加 b 按一下"-"然后按一下"B",计算器显示的数值减少 b 请问至少需要按多少下A键才能让计算器显示的值显示为0 | ||||||||
输入(请使用标准输入输出,而不要读写文件)
| ||||||||
输入包含三个正整数 a 、 b 、 c ,以空格隔开,满足 0<a<2^95 , 0<b<2^95 , 0<c<2^95 , a 、b 分别表示A键和B键的对应数值, c 表示计算器显示的初始值。(2^95 表示2的95次幂)
| ||||||||
输出(请使用标准输入输出,而不要读写文件)
| ||||||||
输出只有一个数,即为 A 键被按的次数的最小值(我们确保输入的情况都有对应的答案)
| ||||||||
|
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
//#include <math.h>
#include "math.h"
void main()
{
double a,b,c;
int j=0;
int di=0,dj;
int i=0;
bool accc=false;
bool acc=false;
double temp;
bool flag=false;
int times=1000000;
cout<<"输入三个数字a b c:"<<endl;
cin>>a>>b>>c;
for( i=0;i<100000&&!flag;i++) ///+ +
{
for( j=0;j<100000&&!flag;j++)
{
if((i*a+j*b)==c)
{ times=i; di=i; dj=j; flag=true; }
if((i*a+j*b)>c) break;
}
if(i*a>c)
break;
}
flag=false;
cout<<"2============================="<<endl;
for(i=0;i<times&&!flag;i++) //+ -
{
temp=i*a;
acc=false;
accc=false;
for( j=0;j>-300000&&!flag;j--)
{
if((temp+j*b)>c&&!acc)//jiasu acc
{
j=j-3000;
continue;
}
else if(!acc)
{
acc=true;
j=j+3000;
}
if((temp+j*b)>c&&!accc)//加速accc
{
j=j-600;
continue;
}
else if(!accc)
{
accc=true;
j=j+600;
}
if((temp+j*b)==c)
if(i<times)
{ times=i; di=i; dj=j; if(!flag) cout<<"成功计算出一个了!"<<endl;flag=true;}
if((temp+j*b)<c)
break;
}
if((times/100)!=0)
if((i)%(times/100)==99)
cout<<1+(i)*100/times<<"%"<<endl;
}
flag=false;
cout<<"3============================="<<times<<endl;
for(i=0;i>-times&&!flag;i--)//- +
{
acc=false;
accc=false;
temp=i*a;
for( j=0;j<1000000&&!flag;j++)
{
if((temp+j*b)<c&&!acc)//加速acc
{
j=j+20000;
continue;
}
else if(!acc)
{
acc=true;
j=j-20000;
}
if((temp+j*b)<c&&!accc)//加速accc
{
j=j+2000;
continue;
}
else if(!accc)
{
accc=true;
j=j-2000;
}
if((temp+j*b)==c)
if(abs(i)<times)
{ times =abs(i); di=i; dj=j; if(!flag) cout<<"成功计算出一个了!"<<endl;flag=true;}
if((temp+j*b)>c)
break;
}
if((times/100)!=0)
if((-i)%(times/100)==99)
cout<<(-i)*100/times<<"%"<<endl;
}
cout<<"进入第四种算法"<<endl;
for(i=0;i>-times&&!flag;i--)//- -
{
temp=i*a;
acc=false;
for( j=0;j>-times&&!flag;j--)
{
if((temp+j*b)>c&&!acc)
{
j=j-3000;
continue;
}
else if(!acc)
{
acc=true;
j=j+3000;
}
if((temp+j*b)==c)
if((abs(i))<times)
{ times=abs(i); di=i; dj=j; flag=true;}
if((temp+j*b)<c)
break;
}
if((temp+j*b)<c)
break;
if((times/100)!=0)
if((-i)%(times/100)==99)
cout<<(-i)*100/times+1<<"%"<<endl;
}
if(di)
cout<<"i= "<<di<<" j= "<<dj<<endl;
getchar();
}