小学生游戏
| ||||||||
程序文件名: pupil.cpp/pupil.pas/...
| ||||||||
某天,无聊的小杰叫上几个同学玩游戏,其中有比较笨的小凤,比较傻的小雪,可爱的小鑫和自以为是的小练。他们去找聪明的小艺去给他们当裁判。判定谁取得游戏胜利。而这个游戏是:由小艺给出一个数 a ,再给出一个数 b ,经过规定的运算,使得数 a 变换成数 b ,且使用最少的变换次数 n .谁先说对这个 n ,谁就取得胜利。当然,因为都是小学生,所以假定如果n>6 ,就算是没有答案。那么裁判小艺试图通过编程来使自己尽快的获得答案。请你帮帮他吧......
问题描述: 题目给出数a(a是一个正整数,不超过50位),再给出目标数b(同样是一个正整数,不超过50位), 数的运算有三种: 1:使当前数加上1985429 2:使当前数加上2006 3:使当前数乘2
需要你求出这个最小的n,如果n>6,输出-1。(此为负一)。
例1:小艺给出数a=1,给出数b=1987437 那么最快我们经过3次指定运算可以使1变成1987437 1*2=2;(第3种变换) 2+1985429=1985431;(第1种变换) 1985431+2006=1987437;(第2种变换) 例2:小艺给出数a=1,给出数b=128 那么最快我们经过7次指定运算可以使1变成128 1*2*2*2*2*2*2*2=128(均采用第3种变换),但是因为n>6,所以按题意输出-1。 | ||||||||
输入 (请使用标准输入输出,而不要读写文件)
| ||||||||
输入仅包含两个整数A、B,每行一个数字,0<A<1e+50,0<B<1e+50。
| ||||||||
输出 (请使用标准输入输出,而不要读写文件)
| ||||||||
输出只有一行,即为最少的变换次数 n ,若 n>6 则输出-1。
| ||||||||
|
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
int innum,outnum;
int total;
int j=0;
int k=0;
int i=0;
bool flag=false;
cin>>innum>>outnum;
total=innum;
for( i=0;i<5;i++) //先+198429,再+2006,最后*2。
{
int temp1=total;
for(j=0;j<900;j++)
{
int temp2=temp1;
for(k=0;k<1000000;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============1==============="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2*=2;
}
if(temp1==outnum)
{
flag=true;
cout<<"============1==============="<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1+=2006;
}
if(total==outnum)
{
flag=true;
cout<<"============1==============="<<endl;
goto loop;
}
if(total>outnum) break;
total+=1985429;
}1/
total=innum;
for( i=0;i<900;i++)//先+2006,再+198429,最后*2。
{
int temp1=total;
for(j=0;j<5;j++)
{
int temp2=temp1;
for(k=0;k<1000000;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============2==============="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2*=2;
}
if(temp1==outnum)
{
flag=true;
cout<<"============2==============="<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1+=1985429;
}
if(total==outnum)
{
flag=true;
cout<<"============2==============="<<endl;
goto loop;
}
if(total>outnum) break;
total+=2006;
}2///
total=innum;
for(i=0;i<900;i++)//先+2006,再*2,最后+198429。
{
int temp1=total;
for(j=0;j<1000000;j++)
{
int temp2=temp1;
for(k=0;k<5;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============3==============="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2+=1985429;
}
if(temp1==outnum)
{
flag=true;
cout<<"============3==============="<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1*=2;
}
if(total==outnum)
{
flag=true;
cout<<"============3==============="<<endl;
goto loop;
}
if(total>outnum) break;
total+=2006;
}/3///
total=innum;
for(i=0;i<5;i++)//先+198429,再*2,最后+2006。
{
int temp1=total;
for(j=0;j<100000;j++)
{
int temp2=temp1;
for(k=0;k<900;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============4==============="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2+=2006;
}
if(temp1==outnum)
{
flag=true;
cout<<"============4==============="<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1*=2;
}
if(total==outnum)
{
flag=true;
cout<<"============4==============="<<endl;
goto loop;
}
if(total>outnum) break;
total+=1985429;
}//4//
total=innum;
for(i=0;i<10000;i++)//先*2,再+198429,最后+2006。
{
int temp1=total;
for(j=0;j<5;j++)
{
int temp2=temp1;
for(k=0;k<900;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============5==========1====="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2+=2006;
}
if(temp1==outnum)
{
flag=true;
cout<<"============5=========2======"<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1+=1985429;//a
}
if(total==outnum)
{
flag=true;
cout<<"============5=========3======"<<endl;
goto loop;
}
if(total>outnum) break;
total*=2; //c
}//5/
total=innum;
for(i=0;i<100000;i++)//先*2,再+198429,最后+2006。
{
int temp1=total;
for(j=0;j<5;j++)
{
int temp2=temp1;
for(k=0;k<900;k++)
{
if(temp2==outnum)
{
flag=true;
cout<<"============6==============="<<endl;
goto loop;
}
if(temp2>outnum) break;
temp2+=1985429;
}
if(temp1==outnum)
{
flag=true;
cout<<"============6==============="<<endl;
goto loop;
}
if(temp1>outnum) break;
temp1+=2006;//a
}
if(total==outnum)
{
flag=true;
cout<<"============6==============="<<endl;
goto loop;
}
if(total>outnum) break;
total*=2; //c
}//6/
loop:
int temp=i+j+k;
if(flag&&temp<570)
{
FILE *fp;
fp=fopen("1.txt","w");
fprintf(fp,"%d %d/n",innum,outnum);
fprintf(fp,"%d %d %d",i,j,k);
fclose(fp);
cout<<"计算步骤= "<<i+j+k<<endl;
cout<<" successed"<<endl;
}
else
cout<<"failed -1"<<endl;
getchar();
}