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;
}
转载请注明原文地址: https://www.6miu.com/read-34421.html