C题一道,,= =

kanone0seele 2010-03-22 09:00:14
题目如下:

有一分数序列

2/1,3/2,5/3,8/5,13/8,21/13,...

求前20项之和,用分数表示。


...全文
583 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
au9ustine 2010-12-20
  • 打赏
  • 举报
回复
use gmp
饅頭 2010-04-02
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 yangsen600 的回复:]

C/C++ code

#include "stdio.h"
#define N 22
long num[N];
void main()
{
int i,j,c;
double s,su,sum;
i=0;j=1;c=0;
s=1;sum=0;
while(c<=N)
{
num[c]=j;
j=i+j;
……
[/Quote]
我的TurboC for Windows,编译为什么分母都是0呢?
2/0+3/0+5/0+8/0+13/0+…=310584899837265700000000000000000000000.000000/9692987370815490900000000000000000000.000000=32.042227

单独拿出来就没问题。比如把注释拿掉,就会显示 1、2、3、5……
for(k=1;k<21;k++)
{
/*printf("%d",num[k]);
printf("\r\n");*/
printf("%d/%d",num[k+1],num[k]);
if(k<20)
printf("+");
}
谢谢指导。
jing78704478 2010-03-23
  • 打赏
  • 举报
回复
学习学习
24K純帥 2010-03-23
  • 打赏
  • 举报
回复
通向公式:f(x+1)-1/f(x)=1
ithiker 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 huanmie_09 的回复:]
引用 8 楼 cy330206 的回复:
楼上貌似不是用分数表示的吧

1.0 * n / m , 算分数吧。呵呵

C/C++ code

for(i = 0; i < MAX; i++) {
sum = sum + 1.0 * n / m;
t = m; /*保存当前项分母*/
m = n; /*后一项的分母等于……
[/Quote]

最后的sum要用分数的形式,没有任何精度误差
ithiker 2010-03-23
  • 打赏
  • 举报
回复
楼上的想法很好,我试了一下,好像溢出了,改为long也溢出~
ithiker 2010-03-23
  • 打赏
  • 举报
回复
这个题目用分数表示意义不大,你想分母是fibonaci数列前二十项就很大了:1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946;即使运行中分母和分子约去部分,通分后的数(分子或分母)也是个非常大的数;如果真要用分数表示结果,用现有的数据类型给出最终的结果不太可能,解决办法是用大数运算
yangbolanse 2010-03-23
  • 打赏
  • 举报
回复

#include<stdio.h>
int main(void)
{
int a[20],b[20];//a数组代表分母,b数组代表分子
a[0] = 1;
a[1] = 2;
b[0] = 2;
b[1] = 3;
int n;
long int sum,sub;
sum = 2;
sub = 7;
int m;
scanf("%d",&m);// m表示求的项数
for(n=2; n<m; n++)
{
a[n] = a[n-1]+a[n-2];
}
for(n=2; n<m; n++)
{
b[n] = b[n-1]+b[n-2];
}
for(n=2; n<m; n++)
{
sub = sub*a[n]+sum*b[n];
sum = sum*a[n];
unsigned int i=0, sq = 0;
sq = (unsigned int)sqrt((double)sum);
for(i=2; i<=sq; i++) //约分
{
if(sub%i==0 && sum%i==0)
{
sub = sub/i;
sum = sum/i;
sq = (unsigned int)sqrt((double)sum);
}
}
}
printf("%d/%d\n",sub,sum);
return 0;
}

改了下 太大了 还是溢出 只能算到前11位 vc里面long int 也只4字节 不够用
we_sky2008 2010-03-23
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
class A
{
public:
A(long int i, long int j) : x(i), y(j){}
void AddNext(long int a, long int b)
{
x = x * b + y * a;
y = y * b;

for (long int i = 2; i <= x && i <= y; i++)
{//约分
if ((x % i) == 0 && (y % i) == 0)
{
x /= i;
y /= i;
}
}
}
void print()
{
cout<<x<<'/'<<y<<endl;
}
private:
long int x;//分子
long int y;//分母
};

int main()
{
A result(2, 1);
int i, j, k, temp;
for (i = 3, j = 2, k = 0; k < 19; k++)//老半天才出结果,怕是溢出了!
{
result.AddNext(i, j);
temp = i;
i = i + j;
j = temp;
}
result.print();
system("pause");
return 0;
}
白杨湖 2010-03-23
  • 打赏
  • 举报
回复
学习了~~~
xuwmzi 2010-03-23
  • 打赏
  • 举报
回复
如果想要有所提高,就要敢于自己分析解决问题
  • 打赏
  • 举报
回复
#include <stdio.h>

int main(void)
{
int a1=2,b1=1,a2=3,b2=2;
int s=0;
int i=0;
s+=a1/b1+a2/b2;
for(;i<18;i++)
{
a2=a1+a2;
b2=b1+b2;
s+=a2/b2;
a1=a2;
b1=b2;
}
printf("%d",s);
return(0);
}


这样写不知道对不对呀!
kanone0seele 2010-03-23
  • 打赏
  • 举报
回复
最后作出来了,得约去最大公约数化简的,,结果应该正确吧,,= =,,

http://blog.csdn.net/kanone0seele/archive/2010/03/23/5409486.aspx
kanone0seele 2010-03-23
  • 打赏
  • 举报
回复
抱歉啊,,已经结贴了,,要是早一些的话就选你了
千杯不醉-sen 2010-03-23
  • 打赏
  • 举报
回复

#include "stdio.h"
#define N 22
long num[N];
void main()
{
int i,j,c;
double s,su,sum;
i=0;j=1;c=0;
s=1;sum=0;
while(c<=N)
{
num[c]=j;
j=i+j;
i=num[c++];
//printf("%d\t%d\n",j,c-1);
}
for(int k=1;k<21;k++)
{
printf("%d/%d",num[k+1],num[k]);
if(k<20)
printf("+");
}
for (i=0;i<20;i++)
{
s*=num[i];
}
for (i=1;i<21;i++)
{
su=s*num[i]/num[i-1];
sum+=su;
}
printf("\n=%f/%f",sum,s);
s=sum/s;
printf("=%f\n",s);

}


运行结果:

2/1+3/2+5/3+8/5+13/8+21/13+34/21+55/34+89/55+144/89+233/144+377/233+610/377+987/610+1597/987+2584/1597+4181/2584+6765/4181+10946/6765+17711/10946=310584899837265700000000000000000000000.000000/9692987370815490900000000000000000000.000000=32.042227

楼主看一下。
千杯不醉-sen 2010-03-23
  • 打赏
  • 举报
回复
仔细想想吧,确实有些度。

int i,j,c;
i=0;j=1;c=0;
while(c<=N)
{
num[c]=j;
j=i+j;
i=num[c++];
}
for(int k=1;k<=21;k++)
{
printf("%d/%d",num[k+1],num[k]);
if(k<21)
printf("+");
}
printf("=\n");
千杯不醉-sen 2010-03-23
  • 打赏
  • 举报
回复

2/1+3/2+5/3+8/5+13/8+21/13+34/21+55/34+89/55+144/89+233/144+377/233+610/377+987/610+1597/987+2584/1597+4181/2584+6765/4181+10946/6765+17711/10946+28657/17711=32.660259......
yangbolanse 2010-03-22
  • 打赏
  • 举报
回复

#include<stdio.h>
int main(void)
{
int a[20],b[20];//a数组代表分母,b数组代表分子
a[0] = 1;
a[1] = 2;
b[0] = 2;
b[1] = 3;
int n,sum,sub,den=0;
sum = 2;
sub = 0;
for(n=2; n<20; n++)
{
a[n] = a[n-1]+a[n-2];
sum*=a[n]; //求出分母
}
for(n=2; n<20; n++)
{
b[n] = b[n-1]+b[n-2];
}
for(n=0; n<20; n++)
{
den = sum*b[n]/a[n];
sub+=den; //求出分子
}
unsigned int sq = 0;
sq = (unsigned int)sqrt((double)sum);
for(int i=2; i<sq; i++) //分母和分子约分
{
if(sub%i==0 && sum==0)
{
sub = sub/i;
sum = sum/i;
sq = (unsigned int)sqrt((double)sum);
}
}
printf("%d / %d",sub,sum);
}
kanone0seele 2010-03-22
  • 打赏
  • 举报
回复
错了,,代码里面那个“十”改成“六”
kanone0seele 2010-03-22
  • 打赏
  • 举报
回复
这是我想的代码,,但是总是会发生溢出啊,前9个求和都可以正常显示,但是第十个出错了,应该是因为超出范围了吧,不知道有没有解决办法,= =


#include<stdio.h>
void main()
{
unsigned int suma,sumb;
int t,i,a1,b1,a2,b2,c=0;
for(suma=2,sumb=1,a1=2,b1=1,i=2;i<=6;i++) /*分数a1/b1和a2/b2,这里累加到第十项*/
{
a2=a1+b1;
b2=a1;
suma=suma*b2+a2*sumb; /*suma表示最后求和的分子,sumb表示求和的分母*/
sumb=sumb*b2;
while(suma>=sumb) /*把假分数化成真分数,整数值为c*/
{
suma=suma-sumb;
c=c+1;

}
a1=a2;
b1=b2;
}
printf("%d/%d\n",a1,b1); /*输出第10项*/
printf("%d %d/%d\n",c,suma,sumb); /*输出前10项的和*/
}
加载更多回复(10)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧