1,2,4,2,3,6,12,6,3,....求第n项值
#include <stdio.h>
int fun(int n, int* x, int* y)//求n项值以及该值所处行列,*x表示第几行,*y表示第几列
{
int sum = 0, i;//sum表示计算第i行及之前所有数的总数量(数据数量)
int size = 0;
int dd = 1;//下面说了:dd=*x,初始化,是之后计算具体数值的参数
for (i = 1; i <= (*x); i++)//计算总的数据数量(包括所求数值所在行的整行数据)
{
sum += (2 * i - 1);
}
if (sum == n)//当该项位置与数据数量相同(即该数正好是每一行最后那个数)
{
*y = 2 * (*x) - 1;//此时该数的列数就是该行数据的个数
return (*x);//返回行数
}
else if (sum > n)//当该项位置小于总数据量(就是该数不在行的末尾,在中间或开头)
{
(*y) = n - (sum - (2 * (*x) - 1));//用该数的序号n减去该数所在行前面行的所有数据数即得到此第n个数的列数
size = 2 * (*x) - 1;
dd = (*x);//每一行的初始值就是它的行标
for (i = 2; i <= (*y); i++)//从第二行开始一直索引
for (i = 2; i <= (*y); i++)//从第二列开始索引,想要求出每个数的数值
{
if (i <= (*x))//如果列数是小于行标的话,从该行的第二列开始,数值就是前一列的两倍(以改行第一列数值为基数)
dd *= 2;
else
dd /= 2;//如果列数大于行标,数值就是第前一列的1/2
}
return dd;//返回第n个数的数值
}
else//当该项位置大于目前总数据量,行数增加,进入递归
{
(*x)++;
return fun(n, x, y);
}
}
int main()
{
int n;
int row = 1, col = 0;
int val;
row = 1;
col = 0;
printf("请输入n:");
scanf_s("%d", &n);
val = fun(n, &row, &col);//调用函数
printf("第%d项是:%d\n", n, val);//输出第n项的数值
return 0;
}
该数列规律:
(1) 1
(2) 2-4-2
(3) 3-6-12-6-3
(4) 4-8-16-32-16-8-4
(5) 5-10-20-40-80-40-20-10-5
代码中引入参数*x和*y表示行数和列数,同时*x还表示每行的首元素值
问题设置:
选项设置: