首页 > 试题广场 >

变幻莫测

[编程题]变幻莫测
  • 热度指数:183 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定两个整数 X,Y,你可以任意顺序多次执行以下两种操作之一:
{\hspace{20pt}}_\texttt{1.}\,交换(X,Y)=(Y,X)
{\hspace{20pt}}_\texttt{2.}\,变换(X,Y)=(X+Y,X-Y)
\hspace{15pt}求使 X=Y 成立所需的最少操作次数;如无法实现,输出 -1

输入描述:
\hspace{15pt}输入一行,包含两个整数 X,Y\ ( -100\le X,Y\le100 )


输出描述:
\hspace{15pt}输出一个整数——使 X=Y 所需的最少操作次数;如无法实现,输出 -1
示例1

输入

5 8

输出

-1

说明

(5,8) 无论如何操作,无法使两者相等,故输出 -1
示例2

输入

5 -5

输出

3

说明

一种最优操作序列为: 

{\hspace{8pt}}_\texttt{1.}\,变换:(5,-5)\to(0,10)
{\hspace{8pt}}_\texttt{2.}\,交换:(0,10)\to(10,0)
{\hspace{8pt}}_\texttt{3.}\,变换:(10,0)\to(10,10)

3 步使得 X=Y
a, b = map(int, input().split())
if a==b:
    print(0)
elif b==0:
    print(1)
elif a==0:
    print(2)
elif a+b==0:
    print(3)
else:
    print(-1)

# 新手第一次震惊,原来找规律也属于暴力的一种

发表于 2025-06-25 02:21:34 回复(0)
写的有点杂:
#include <stdio.h>
void fun_jiao(int *x,int *y)
{
    int i = 0;
    i = *x;
    *x = *y;
    *y = i;
}
void fun_bian(int *x,int *y)
{
    int i = 0;
    i = *x - *y;
    *x = *x + *y;
    *y = i;
}
int fun_count1(int x,int y)//先变再交换
{
    int count1 = 0;
     while(1)
    {
        if(x != y){
            fun_bian(&x,&y);
            count1++;
        }else{
             return count1;
        }
        if(x != y){
            fun_jiao(&x,&y);
            count1++;
        }else{
             return count1;
        }
        if(count1 > 100)
        {
            return -1;
        }
    }    
}
int fun_count2(int x,int y)//先交换再变
{
    int count2 = 0;
     while(1)
    {
        if(x != y){
            fun_jiao(&x,&y);
            count2++;
        }else{
             return count2;
        }
        if(x != y){
            fun_bian(&x,&y);
            count2++;
        }else{
             return count2;
        }
        if(count2 > 100)
        {
            return -1;
        }
    }
}

int main() {
   
    int x,y,x2,y2;
    int count1 = 0;//计数次数
   
    int count2 = 0;//计数次数
    scanf("%d %d", &x, &y);
    x2 = x;
    y2 = y;
    count1 = fun_count1(x,y);
    count2 = fun_count2(x2,y2);
    if((count1 == -1)&&(count2 == -1))
    {
        printf("-1\n");
        return 0;
    }
    if(count1 > count2)
    {
        printf("%d\n",count2);
    }else{
        printf("%d\n",count1);
    }
   
    return 0;
}

发表于 2025-06-24 11:04:34 回复(0)