c++问题如下来一个先生来解答

有一个分数序列:2/1,3/2,5/3,8/5,13/8,……,求出第10项的值和前10项的和,并输出,一行一个数字。

这么写就行:

#include<iostream>

using namespace std;

int main()
{
    int i,j;
    double a=2; //分子
    double b = 1;//分母
    double sum = 0; //值
    double temp = 0;//临时变量
    for(i = 0; i < 10; i++) {
         sum += a/b;
         temp = a;
         a += b;
         b = temp;
         cout<<sum<<endl;
    }
    return 0;
}

img

用for循环,将分子分母 用i和j区分开来。
斐波那契数列

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a=0,b=1,c=1,n;
    cin>>n;//输入n
    for(int i=1;i<=n;i++)
    {
        a=b;
        b=c;
        c=a+b;
    }
    cout<<c;//输出最终结果 
    return 0;
}
  将斐波那契数列获取方式写成接口函数,在计算i j的方法里直接调用即可。
#include<stdio.h>
long long int nume, deno;
long long int prime(long long int bigger,long long int smaller)
{
if (smaller == 1) return 1;
if (smaller == 0) return bigger;
return prime(smaller, bigger%smaller);
}
void CalcA(int n)
{
int a = 1, b=1;
int i;
nume = 0;
deno = 1;
for (i=0; i< n; ++i)
{
if (a > b)
{
b += a;
nume *= a;
nume += deno*b;
deno *=a ;
} else
{
a += b;
nume *= b;
nume += deno*a;
deno *= b;
}
}
}
int main()
{
int n[1024] = {0};
int t;
int i;
long long int p;
scanf("%d", &t);
for (i=0; i<t; ++i)
{
scanf("%d", &n[i]);
}
for (i=0; n[i]>0; ++i)
{
CalcA(n[i]);
p = prime(nume, deno);
if (p>1) {nume /=p ; deno /= p;}
printf("%lld/%lld\n", nume, deno);
}
}

方法一(单看分子、分母法)
注:p[]是用来专门存放分子的,q[]是用来专门存放分母的。

核心算法思想:从第四项起,每循环一次,都要先找出该项(第i项)的前两项的分子,然后把它们的和放入p[i]中,再找出该项(第i项)前两项的分母,然后把它们的和放入q[i]中。这样该项(第i项)的分子、分母就分别存放到了正确的位置了。

相应的代码: if(p[i-1]>p[i-3]&&p[i-2]>p[i-3]){

              p[i]=p[i-1]+p[i-2];

              if(q[i-1]>q[i-3]&&q[i-2]>q[i-3]){

                 q[i]=q[i-1]+q[i-2];

              }

         }

方法二:(分子、分母皆看法)
注:a变量:专门存放分子;b变量:专门存放分母。

核心算法思想;替换。用变量t存放临时的分子值(目的是传递给后一项作分母用),保证了a变成了后一项的分子时,变量b还能收到正确的分母值。

相应的代码: sum=sum+a/b;

        t=a;

        a=a+b;   

        b=t;