问题描述:整数i的两种变换定义为 f(i)=3i,g(i)=i/2(向下取整);设计一个算法求给定两个整数n和m,用最少次数的f 和 g变换将整数n变换为m;例如 :可以将整数15通过4次变换将它变成4,4=gfgg(15)。当整数n不可能转换为m时,算法应当怎么处理。本题是当出现重复数字,认为无法转换。
代码如下:
#include <iostream>
#include<stdlib.h>
#include <vector>
//vector是用数组实现的,每次执行push_back操作,相当于底层的数组实现要重新分配大小(即先free掉原来的存储,后重新malloc)
using namespace std;
vector<char> a;//头文件#include <vector>中包含方法push_back,这里使用是为了方便向数组中插入符号
vector<int> s;
int sum = 1, flag = 1;//sum表示转换次数,flag是为了输出无法变换时更加美观
bool Solve(int k,int n,int m)
{
int b=0;
//当执行次数过多,出现重复数字时,认为其无法转换
for (int i = 0; i < s.size(); i++)
{
if (b == s[i])
{
printf("无法变换!\n");
flag = 0;
return true;
}
}
//当转换次数过多,不符合最简转换要求
if (k > sum)
return false;
b = n;
//将出现过的n进行存储,方便判断
s.push_back(n);
for (int i = 0; i < 2; i++)
{
if (i == 0)
b = n * 3;
else
b = n / 2;
//当两者相等,或深度检索,递归可相等时
if (b == m || Solve(k + 1,b,m))
{
if (i == 0)
a.push_back('f');
else
a.push_back('g');
return true;
}
}
return false;
}
int main()
{
int n, m;//n,m为两个整数
cout << "请输入待转换整数n:";
cin >> n;
cout << "请输入目标整数m:";
cin >> m;
while (!Solve(1,n,m))//一次转化无法成功时,次数加一
sum++;
while (flag) //为了输出无法转换更加美观
{
cout << sum << endl;
for (int i = 0; i < a.size(); i++)
cout << a[i];
cout << endl;
flag = 0;
}
system("PAUSE");
return 0;
}
示例输入输出:
学习中,欢迎交流