【编程比赛】《小学生游戏 》
出两个题给大家,活跃一下板块气氛。
这些题是我们学校举行的编程大赛中的题目(已经结束),大家可以试试,把你代码贴上来,最好有注释,方便大家看。
ps:为简单起见,不需考虑题中的高精度数计算,用long 代替即可。
小学生游戏
程序文件名: 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。
样例输入1样例输出11
19874373样例输入2样例输出21
128-1
参考代码:
- //JAVA,支持高精度数
- import java.util.*;
- import java.io.*;
- import java.math.BigInteger;
- public class Pupil{
- private static final int MAX_DEPTH =6;
- private static final BigInteger x =new BigInteger("1985429"),y =new BigInteger("2006"),z =new BigInteger("2");
- private static BigInteger iB;
- private static int depth,min;
- private static void search(BigInteger a){
- if(depth>=min||depth>MAX_DEPTH||a.compareTo(iB)>0) return;
- if(iB.equals(a)){
- min =depth;
- return;
- }
- depth++;
- search(a.add(x));
- search(a.add(y));
- search(a.multiply(z));
- depth--;
- }
- public static int solve(BigInteger a,BigInteger b){
- iB =b;
- min =MAX_DEPTH+1;
- depth =0;
- search(a);
- if(min ==MAX_DEPTH+1) return -1;
- else return min;
- }
- public static void main(String[] args){
- Scanner scan =new Scanner(System.in);
- System.out.println(solve(scan.nextBigInteger(),scan.nextBigInteger()));
- }
- }
-
-
-
复制代码
- //GVmaker
- #define MAX_LEN 10
- #define MAX_DEP 6
- char numKey[]="0bnmghjtyu";
- long numB,min,depth;
- long getNum(int x,int y){
- char buf[MAX_LEN+2],key;
- long num,n,k;
- buf[MAX_LEN+1] =0;
- n =0;
- while(1){
- memset(buf+n,' ',MAX_LEN+1-n);
- buf[n] ='_';
- TextOut(x,y,buf,0x41);
- key =getchar();
- if(key==0x0d) break;
- if(key==0x1b) exit(0);
- if(key==23&&n>0) n--;
- else{
- for(k=0;k<10&&numKey[k]!=key;k++);
- if(k>=10||n>=MAX_LEN) continue;
- buf[n++]=k+'0';
- }
- }
- num =0;
- for(k=0;k<n;k++) num =num*10+buf[k]-'0';
- return num;
- }
- void search(long a){
- if(depth>=min||depth>MAX_DEP||a>numB) return;
- if(a==numB){
- min =depth;
- return;
- }
- depth++;
- search(a+1987437);
- search(a+2006);
- search(a<<1);
- depth--;
- }
- void main(){
- long numA;
- while(1){
- ClearScreen();
- Refresh();
- numA =getNum(2,2);
- numB =getNum(2,16);
- min =MAX_DEP+1;
- depth=0;
- search(numA);
- if(min==MAX_DEP+1) printf("-1\n");
- else printf("%d\n",min);
- getchar();
- }
- }
-
复制代码
[此贴子已经被作者于2006-5-10 4:05:12编辑过]
|