
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define MAX_FIB 100 //定义最大Fibonacci数列长度
int fib[MAX_FIB]//存放Fibonacci数列的数组
int fib_len = 0 //Fibonacci数列长度
//计算Fibonacci数列的函数
void *calculate_fib(void *arg) {
int n = *(int *)arg//获取Fibonacci数列长度参数
int fib0 = 0, fib1 = 1//初始化Fibonacci数列的前两个数
fib[0] = fib0
fib[1] = fib1
for (int i = 2i <ni++) {
//计算第i个数,即前清慎两个数的和
int fibn = fib0 + fib1
fib[i] = fibn//将第i个数存放到数组中
fib0 = fib1 //更新前两个数
fib1 = fibn
}
fib_len = n//更新Fibonacci数列长度
pthread_exit(NULL)//退出线程
}
int main() {
int n
pthread_t tid//线程ID
printf("请输入要产生Fibonacci序列数:")
scanf("%d", &n)
//创建子喊正团线程,计算Fibonacci数列
if (pthread_create(&tid, NULL, calculate_fib, (void *)&n) != 0) {
printf("创建子线程失败!\n")
exit(1)
}
//等待子线程结束
if (pthread_join(tid, NULL) != 0) {
printf("等待子线程结束失败!\n")
exit(1)
}
//输出Fibonacci数列
printf("Fibonacci数列:")
for (int i = 0i <fib_leni++) {
printf("%d ", fib[i])
}
printf("\n")
return 0
}
在主函数中,先读取用户输入的Fibonacci数列长度n,然后创建一个新的线程来计算Fibonacci数列。在子线程中,先计郑橘算出前两个数0和1,并存放到数组中,然后从第3个数开始计算,每次计算前两个数的和,将结果存放到数组中,同时更新前两个数,直到计算完n个数为止。计算完毕后,子线程将Fibonacci数列长度和数组返回给主线程。在主线程中,使用pthread_join函数等待子线程结束,并将Fibonacci数列输出到屏幕上。
1、首先打开vc,点击文件、新建;
2、选择win32 console application 并在右侧输入工程的名字和地址,确定;
3、选择一个空的工程,完成。
4、再次点击文件、新建,
5、选择c++ source file 并输入文件名字,确定,
6、输入如图所示的代码,这里以前十个斐波那契数列数姿搏为例,需要输迹禅祥出其他个数请把5改成对应数字的一半(比如要输出前20个,就把图中的5改成10);
7、点击右上角的编译运行按钮。
8、成功地输出了斐波那契数列的前袭启十项,如图。
DATAS SEGMENTSTR1 DB 'Please input a number(1-100):N=','$'
STR2 DB 13,10,'FIB(N)=','$'
WRONGSTR DB 13,10,13,10,'A number between 1 and 100 please!',13,10,13,10,'$'
INPUTBUFFER DB 3,?,3 DUP(?)
N DW ?
RESULT1H DW 0
RESULT1L DW 0
RESULT2H DW 0
RESULT2L DW 0
C10 DW 10
OUTPUTBUFFER DB 11 DUP('0')
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
CALL INPUT
CALL FIB
CALL OUTPUT
JMP QUIT
INPUT PROC
JMP T1
WRONG:LEA DX,WRONGSTR
MOV AH,9
INT 21H
T1:LEA DX,STR1
MOV AH,9
INT 21H
LEA DX,INPUTBUFFER
MOV AH,10
INT 21H
MOV AX,0
MOV CL,INPUTBUFFER+1
MOV CH,0
LEA BX,INPUTBUFFER+2
T2:MUL C10
MOV DL,[BX]
CMP DL,'0'
JB WRONG
CMP DL,'9'
JA WRONG
AND DL,0FH
ADD AL,DL
ADC AH,0
INC BX
LOOP T2
CMP AX,0032H
JA WRONG
CMP AX,1
JB WRONG
MOV N,AX
RET
INPUT ENDP
FIB PROC
CMP N,1
JZ L1
CMP N,2
JZ L2
DEC N
CALL FIB
MOV AX,RESULT2L
MOV DX,RESULT2H
MOV CX,RESULT1L
ADD RESULT2L,CX
MOV CX,RESULT1H
ADC RESULT2H,CX
MOV RESULT1L,AX
MOV RESULT1H,DX
JMP EXIT
L1:MOV RESULT1L,1
MOV RESULT2L,1
JMP EXIT
L2:MOV RESULT2L,1
DEC N
CALL FIB
EXIT:RET
FIB ENDP
OUTPUT PROC
MOV AX,RESULT2L
LEA SI,OUTPUTBUFFER
MOV CX,5
R1:MOV DX,0
DIV C10
INC SI
ADD [SI],DL
LOOP R1
MOV AX,RESULT2H
LEA SI,OUTPUTBUFFER
MOV CX,5
R2:MOV DX,0
DIV C10
INC SI
PUSH CX
CMP DX,0
JE NOADD
MOV CX,DX
ADDN:CALL ADD65536
LOOP ADDN
NOADD:POP CX
LOOP R2
LEA DX,STR2
MOV AH,9
INT 21H
LEA SI,OUTPUTBUFFER
MOV BX,10
R3:CMP BYTE PTR [SI+BX],'0'
JA PRINT
DEC BX
JMP R3
PRINT:MOV DL,[SI+BX]
MOV AH,2
INT 21H
DEC BX
CMP BX,1
JAE PRINT
RET
OUTPUT ENDP
ADD65536 PROC
ADD BYTE PTR [SI],6
MOV DL,0
CMP BYTE PTR [SI],3AH
JB A1
SUB BYTE PTR [SI],10
MOV DL,1
A1:ADD BYTE PTR [SI+1],3
ADD BYTE PTR [SI+1],DL
MOV DL,0
CMP BYTE PTR [SI+1],3AH
JB A2
SUB BYTE PTR [SI+1],10
MOV DL,1
A2:ADD BYTE PTR [SI+2],5
ADD BYTE PTR [SI+2],DL
MOV DL,0
CMP BYTE PTR [SI+2],3AH
JB A3
SUB BYTE PTR [SI+2],10
MOV DL,1
A3:ADD BYTE PTR [SI+3],5
ADD BYTE PTR [SI+3],DL
MOV DL,0
CMP BYTE PTR [SI+3],3AH
JB A4
SUB BYTE PTR [SI+3],10
MOV DL,1
A4:ADD BYTE PTR [SI+4],6
ADD BYTE PTR [SI+4],DL
MOV DL,0
CMP BYTE PTR [SI+4],3AH
JB A0
SUB BYTE PTR [SI+4],10
MOV DL,1
A5:ADD BYTE PTR [SI+5],DL
MOV DL,0
CMP BYTE PTR [SI+5],3AH
JB A0
SUB BYTE PTR [SI+5],10
MOV DL,1
A6:ADD BYTE PTR [SI+6],DL
MOV DL,0
CMP BYTE PTR [SI+6],3AH
JB A0
SUB BYTE PTR [SI+6],10
MOV DL,1
A7:ADD BYTE PTR [SI+7],DL
MOV DL,0
CMP BYTE PTR [SI+7],3AH
JB A0
SUB BYTE PTR [SI+7],10
MOV DL,1
A8:ADD BYTE PTR [SI+8],DL
MOV DL,0
CMP BYTE PTR [SI+8],3AH
JB A0
SUB BYTE PTR [SI+8],10
MOV DL,1
A9:ADD BYTE PTR [SI+9],DL
A0:RET
ADD65536 ENDP
QUIT:MOV AH,4CH
INT 21H
CODES ENDS
END START
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)