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();
}