1.求第n个斐波那契数(非递归实现)。 2.一个数组中只有两个数字是出现一次,其他所有数字都出现 了两次。 找出这两个数字,编程实现。

来源:互联网 发布:mysql community 编辑:程序博客网 时间:2024/06/05 03:41
1.求第n个斐波那契数(非递归实现)。

2.一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
  找出这两个数字,编程实现。

//100010010



代码1:
斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
这个数列从第3项开始,每一项都等于前两项之和
#include <stdio.h>
#include <assert.h>
#include <windows.h>

#pragma warning(disable:4996)

long rfib(int n)
{
if ( n <= 2 )
{
return 1;
}
return fib(n-1) + fib(n-2);
}

long fib(int n)
{
long pren = 1;
long prenn = 1;
int i = 3;
long data = 1;
for (; i <= n; i++){
data = pren + prenn;
prenn = pren;
pren = data;
}
return data;
}

int main()
{
printf(
"Please Enter: ");
int n = 0;
scanf(
"%d", &n);
//long data = rfib(n);
printf(
"%u\n", fib(n));
system(
"pause");
return 0;
}

代码2: 按照之前的一个独立数据,现在2个,可以对其进行分类处理
#include <stdio.h>
#include <assert.h>
#include <windows.h>

void find_data(int *arr, int len, int *data1, int *data2)
{
assert(arr && len > 0);
assert(data1);
assert(data2);

int tmp = arr[0];
int i = 1;
for (; i < len; i++){
tmp ^=
 arr[i];
}
//tmp is data1 and data2 ^ result!
int count = 0;
int flag = 0x1;
while (tmp){
flag <<= count;
if ( tmp & flag ){
break;
}
}
*
data1 = *data2 = 0;
for (i = 0; i < len; i++ ){
if ( arr[i] & flag ){//data1
*
data1 ^= arr[i];
}
else{//data2
*
data2 ^= arr[i];
}
}
}

int main()
{
int arr[] = {1,1, 3,3,4,4,5,5,6,6, 9,19, 19,8, 7, 7};
int len = sizeof(arr) / sizeof(arr[0]);
int data1, data2;
find_data(arr, len, &data1, &data2);
printf(
"diff data : %d, %d\n", data1, data2);
system(
"pause");
return 0;
}

0 0