您的位置:首页 > 其它

HDU_1715 大斐波数

2014-07-31 20:21 232 查看
大斐波数

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
[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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: