求指定初始值的斐波那契数列的余数

今有一种斐波那契数列:F(0)=7,F(1)=11,F(n)=F(n-1)+F(n-2),判断数列的任意一项 F(n)能否被 3 整除。

输出格式

如果该 F(N)能被 3 整除则输出“Y”,否则输出“N”

输入输出样例

输入 #1

7 11 2 3 

输出 #1

Y
#include<stdio.h>

int first, second, mod;

int Fib(int n)

{
	if (n == 0)
		return first;
	else if (n == 1)
		return second;
	else
		return (Fib(n - 1) + Fib(n - 2)) % mod;
}

int main()
{
	int n = 0;

	printf("请输入数列中起始的两个数\n");
	scanf("%d%d", &first, &second);

	printf("请输入求数列中第几个数的余数\n");
	scanf("%d", &n);

	printf("请输入求余用的模\n");
	scanf("%d", &mod);


	if (Fib(n) == 0)
		printf("Y");
	else
		printf("N");
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是汇编程序,使用子程序计算斐波那契数列: ``` .data n dw ? ; 输入的数值n result dw ? ; 结果存储变量 .code main proc mov ax, @data mov ds, ax ; 初始化数据段寄存器 ; 读取输入的数值n mov ah, 0ah ; 功能号0ah,读取字符串 mov dx, offset n ; 存储字符串的偏移地址 int 21h ; 调用中断 ; 将输入的字符串转换为数值 mov si, offset n + 2 ; 跳过输入的长度和换符 call ascii_to_num ; 调用子程序 ; 计算斐波那契数列 mov ax, 0 ; F(0) = 0 mov bx, 1 ; F(1) = 1 mov cx, result ; 存储结果的变量 mov dx, n ; 循环计数器 call fibonacci ; 调用子程序 ; 输出结果 mov ax, cx ; 将结果存储变量中的值读取到ax中 call write_dec ; 输出结果到屏幕 call crlf ; 输出换符 mov ah, 4ch int 21h ; 程序结束 main endp ; 子程序:将ASCII码字符串转换为数值 ascii_to_num proc push ax push bx push cx push dx xor ax, ax ; ax = 0 mov cx, 10 ; cx = 10 L1: mov bx, 10 ; bx = 10 mul bx ; ax = ax * 10 mov bl, [si] ; 取出当前字符 sub bl, '0' ; 转换为数值 add ax, bx ; ax = ax + bx inc si ; 字符指针加1 loop L1 ; 循环至n次 mov result, ax ; 将转换后的数值存储到结果变量中 pop dx pop cx pop bx pop ax ret ascii_to_num endp ; 子程序:计算斐波那契数列 fibonacci proc push ax push bx push cx push dx L1: cmp dx, 0 ; n == 0? je L2 ; 跳转到L2 mov cx, ax ; cx = F(i-1) add ax, bx ; ax = F(i-1) + F(i-2) mov bx, cx ; bx = F(i-1) dec dx ; n -= 1 jmp L1 ; 继续循环 L2: mov cx, ax ; 将结果存储到结果变量中 pop dx pop cx pop bx pop ax ret fibonacci endp ; 子程序:输出十进制数值 write_dec proc push ax push bx push cx push dx xor bx, bx ; bx = 0 mov cx, 10 ; cx = 10 L1: xor dx, dx ; dx = 0 div cx ; ax = ax / 10, dx = ax % 10 push dx ; 压入余数 inc bx ; bx += 1 or ax, ax ; ax == 0? jnz L1 ; 不为0,继续循环 L2: pop dx ; 取出余数 add dl, '0' ; 转换为ASCII码 mov ah, 02h ; 功能号2,输出字符 int 21h ; 调用中断 dec bx ; bx -= 1 jnz L2 ; bx 不为0,继续循环 pop dx pop cx pop bx pop ax ret write_dec endp ; 子程序:输出换符 crlf proc mov dl, 0dh ; ASCII码0d,回车符 mov ah, 02h ; 功能号2,输出字符 int 21h ; 调用中断 mov dl, 0ah ; ASCII码0a,换符 mov ah, 02h ; 功能号2,输出字符 int 21h ; 调用中断 ret crlf endp ``` 以上程序使用了四个子程序:`ascii_to_num`,`fibonacci`,`write_dec` 和 `crlf`。`ascii_to_num` 用于将输入的ASCII码字符串转换为数值,`fibonacci` 则用于计算斐波那契数列的值,`write_dec` 用于将一个十进制数值输出到屏幕上,`crlf` 则用于输出换符。主程序中使用了两个变量:`n` 存储输入的数值,`result` 存储计算结果。首先读取输入的数值,并调用 `ascii_to_num` 子程序将输入的字符串转换为数值。然后调用 `fibonacci` 子程序计算斐波那契数列,并将结果存储到 `result` 变量中。最后调用 `write_dec` 和 `crlf` 子程序将结果输出到屏幕上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值