关于一个等差数组的算法问题
今天看到一个这样的算法问题,想了半天无果,也查了一下也没有找到很好的方法。
描述大概如下:
对一个等差数组操作,如果元素是偶数,那么对该元素进行除 2 的操作,结果如果还是偶数那么再除2,元素一直除到位奇数为止。如果元素是奇数那么就不该元素进行操作。最后利用这个新数组去还原之前的等差数组。
举个例子 {5,6,7,8} 操作后变成 {5,3,7,1},利用{5,3,7,1}去逆推。
Answers
思想 利用第一个,与第二个数还原数组
int & div_2(int &data;)
{
while(data %2 != 1) data /=2;
return data;
}
void revert_arry(int * data,int num)
{
bool result = false;
int two_num = 2;
int i = 0;
int data_next;
int temp_data = data[1];
int old_data = data[i];
while(!result)
{
if(data[0] <= temp_data)
{
for(i=2;i<num;i++)
{
data_next = data[0] + (tem_data - data[0])*i;//退下一个
if(data[i] != div_2(data_next))
{
result = false;
break;
}
else
{
result = true;
}
}
if(result)
{
data[1] = tempdata;
for(i = 2;i<num;i++)
{
data[i] = data[0] + (temp_data + data[0])*i;
}
}
else
{
two_num *= 2;
temp_data = data[1];
}
}
else
{
old_data =temp_data;
temp_data *= two_num;
}
if( old_data == temp_data && !result)//防止第一个数%2 == 0
{
data[0] *= 2;
}
}
}
只对于递增数组, 可能还有不足。