有一个分数序列: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;
}
用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;