题目描述
小宇正在读小学,今天老师布置了几道数学题目。小宇平时上课经常不专心,这些他可发愁了,怎么办呢?看看你能不能帮帮他。
题目是给你一组有规律序列的前面5个整数,请你给出它后面跟着的5个整数,如:1,2,3,4,5,___,___,_,,___。这是个等差数列,后面应该是6,7,8,9,10,就这么简单。而且现在小宇已经知道这串序列要么是等差数列,要么是等比数列或者是斐波那契数列。
输入
输入包含多组测试数据。每组输入5个整数,每个数字之间隔一个空格,当5个数字都为0时输入结束。
输出
对于每组输入,输出这串数列的后面5个数字,每个数字之间隔一个空格。
样例输入
1 2 3 4 5
1 2 4 8 16
1 2 3 5 8
0 0 0 0 0
样例输出
6 7 8 9 10
32 64 128 256 512
13 21 34 55 89
本题思路很简单但是不容易AC
要注意
- 两数相比会有以下情况:256 128 64 32 16,所以公比定义为double且需要强制类型转换,否则后五个数会输出 0 0 0 0 0
- 公差和公比的定义应写在 if 语句内
- 判断条件应该写完整,否则无法清楚判断2 4 6 10 16这种数据究竟是等差数列还是Fibonacci数列
- 用b - a == c - b && c - b == d - c && d - c == e - d判断是否是等差数列
- 用b / a == c / b && c / b == d / c && d / c == e / d判断是否是等比数列且所有两数之比都要加上double否则不能AC(精度问题)
- 用a + b == c && b + c == d && c + d == e判断是否是Fibonacci数列
AC代码
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main()
{
int a,b,c,d,e;
//abcde不全为0
while (cin >> a >> b >> c >> d >> e && (a || b || c || d || e))
{
int f,g,h,i,j;
//公差相等
if (b - a == c - b && c - b == d - c && d - c == e - d)
{
int d1 = b - a;
f = e + d1;
g = f + d1;
h = g + d1;
i = h + d1;
j = i + d1;
}
//公比相等
else if ((double)b / a == (double)c / b && (double)c / b
== (double)d / c && (double)d / c == (double)e / d)
{
double q1 = (double)b / a;//公比(强转为double解决相比为0的情况)
f = e * q1;
g = f * q1;
h = g * q1;
i = h * q1;
j = i * q1;
}
//Fibonacci 2 4 6 10 16
else if (a + b == c && b + c == d && c + d == e)
{
f = d + e;
g = e + f;
h = f + g;
i = g + h;
j = h + i;
}
cout << f << " " << g << " " << h << " ";
cout << i << " " << j << endl;
}
return 0;
}