大斐波数
Problem Description
s(n)是正整数n的真因子之和,即小于n且整除n的因子和.例如s(12)=1+2+3+4+6=16.如果任何
数m,s(m)都不等于n,则称n为不可摸数.
数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;
}