Problem 1 数学
题目描述 A 是一个学习认真的学生,M老师也对他赞誉有加,很是欣赏。
于是,A 被M老师叫到讲台上讲题。众所周知,A 比较胖,所以他希望找到讲台的某个点,也就是黄金分割点来使他被看起来更加美观。
A 没有计算器,他只能用分数逐渐逼近这个位置。
(虽然A可以脑跑 但是今天想来考验大家)
输入描述 输入文件只有一行,这一行有一个数 N,表示逼近该位置的分数分母≤N。
输出描述 输出文件只有一行,这一行有一个分数,格式为“x/y”,为你所输出的分数。
样例输入 7
样例输出 3/5
数据范围及提示 对于 20%数据 1<=N<=10
对于 100%数据 1≤N≤10^19
char -128 ~ +127 (1 Byte)
short -32767 ~ + 32768 (2 Bytes)
unsigned short 0 ~ 65536 (2 Bytes)
int -2147483648 ~ +2147483647 (4 Bytes)
unsigned int 0 ~ 4294967295 (4 Bytes)
long == int
long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
double 1.7 * 10^308 (8 Bytes)
unsigned int 0~4294967295
long long的最大值:9223372036854775807
long long的最小值:-9223372036854775808
unsigned long long的最大值:1844674407370955161
__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615
找斐波那契数i小于等于n,并且i+1的斐波那契数>n;分子就等于i-1的斐波那契数,分母等于i的斐波那契数。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef unsigned long long LL;
LL f[10000000];
void read(LL &n)
{
n = 0;
char a = getchar();
while(a<'0'||a>'9')
a = getchar();
while(a>='0'&& a<='9')
{
n*=10;
n+=a-'0';
a = getchar();
}
}
int main()
{
LL m,n;
LL fz,fm;
read(n);
f[0]=0;
f[1]=1;
if(n==1)
fz=1,fm=1;
else
{
for(int i=2;i<=1000000000;i++)
{
f[i]=f[i-1]+f[i-2];
if(f[i]>n)
{
m=i-1;
break;
}
}
fz=f[m-1],fm=f[m];
}
printf("%I64d/%I64d", fz, fm);
return 0;
}