您的位置:首页 > 其它

小学生游戏 及程序

2006-06-23 15:22 274 查看
[align=center]小学生游戏[/align]
[align=right]程序文件名: pupil.cpp/pupil.pas/...[/align]
[align=left]  某天,无聊的小杰叫上几个同学玩游戏,其中有比较笨的小凤,比较傻的小雪,可爱的小鑫和自以为是的小练。他们去找聪明的小艺去给他们当裁判。判定谁取得游戏胜利。而这个游戏是:由小艺给出一个数 a ,再给出一个数 b ,经过规定的运算,使得数 a 变换成数 b ,且使用最少的变换次数 n .谁先说对这个 n ,谁就取得胜利。当然,因为都是小学生,所以假定如果n>6 ,就算是没有答案。那么裁判小艺试图通过编程来使自己尽快的获得答案。请你帮帮他吧......
问题描述:
  题目给出数a(a是一个正整数,不超过50位),再给出目标数b(同样是一个正整数,不超过50位),
数的运算有三种:
  1:使当前数加上1985429
  2:使当前数加上2006
  3:使当前数乘2[/align]
[align=left]  需要你求出这个最小的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。[/align]
[align=left]输入 (请使用标准输入输出,而不要读写文件)[/align]
[align=left]  输入仅包含两个整数A、B,每行一个数字,0<A<1e+50,0<B<1e+50。 [/align]
[align=left]输出 (请使用标准输入输出,而不要读写文件)[/align]
[align=left]  输出只有一行,即为最少的变换次数 n ,若 n>6 则输出-1。 [/align]
[align=left]样例输入1[/align]
[align=left]样例输出1[/align]
[align=left]1
1987437[/align]
[align=left]3[/align]
[align=left]样例输入2[/align]
[align=left]样例输出2[/align]
[align=left]1
128[/align]
[align=left]-1[/align]
#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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: