HDU_1715 大斐波数

大斐波数

Problem Description

 

s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.

 

Input

 

包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(2<=n<=1000)是整数。

 

Output

 

如果n是不可摸数,输出yes,否则输出no

 

Sample Input

 

3
2
5
8

 

Sample Output

 

yes
yes
no

 

/*

本题是大数运算,所以仍然需要模拟列数式的方法逐位相加,然后进位运算,要记住大数斐波那契数列的第1000项由209位,所以二维数组的列数要大于209.下面展示一下具体的存法:

1

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

0

0

2

0

0

0

0

0

0

0

0

3

0

0

0

0

0

0

0

0

5

0

0

0

0

0

0

0

0

8

0

0

0

0

0

0

0

0

3

1

0

0

0

0

0

0

0

1

2

0

0

0

0

0

0

0

4

3

0

0

0

0

0

0

0

5

5

0

0

0

0

0

0

0

9

8

0

0

0

0

0

0

0

4

4

1

0

0

0

0

0

0

3

3

2

0

0

0

0

0

0

7

7

3

0

0

0

0

0

0

0

1

6

0

0

0

0

0

0

 

 

代码如下:

打表来存好数

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1007;
int f[N][217];     //第1000项斐波那契数由209位,开的数组的列数要比这个稍微大点 
int main() 
{
    int i, j;
    f[1][0] = f[2][0] = 1;
    for(i = 3; i < N; i++)       //打表算大数斐波那契 
    {
        for(j = 0; j <= 210; j++)
            f[i][j] = f[i-1][j]+f[i-2][j];
        int flag = 0;
        for(j = 0; j <= 210; j++) 
        {
            int tmp = f[i][j] + flag;
            flag = tmp/10;
            f[i][j] = tmp%10;
        }
    }
    int n, pi;
    cin >> n;
    while(n--) 
    {
        cin >> pi;
        i = 210;
        while(f[pi][i] == 0)
            i--;
        for(;i >= 0; i--)
            printf("%d", f[pi][i]);
        printf("\n");
    }
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值