LightOJ - 1008--Fibsieve`s Fantabulous Birthday (找规律)

题目描述:按照题目所给的顺序填充排列自然数,给你一个n,输出n在这个特殊序列中所在的坐标。

思路:一道找规律的题,数据的排列可以类似的看做一个蛇形路段,每一个对勾的拐点就是一个完全平方数,并且开方数刚好就是偶数行的横向坐标或者奇数行的纵坐标,然后再次观察可找到每个对勾的拐角点(也就是说图形的对角线就是本行的完全平方数减去上一行的行数就行),最后根据对角线的位置可以确定n的另外一个坐标。(估计你肯定看不下去,还是看代码吧!)

需要注意的一点就是数据范围别用 int 就行。

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#define LL long long
using namespace std;
int main()
{
    LL T,i,j,n,m,len=1;
    double ans;
    scanf("%lld",&T);
    while(T--)
    {

        scanf("%lld",&n);
        printf("Case %lld: ",len++);
        ans=sqrt(n);
        m=(LL)ans;
        if(ans>m)
            m++;
        LL k=m*m-m+1;
        if(m%2>0)
        {
            if(n<k)
                printf("%lld %lld\n",m,m-(k-n));
            else
                printf("%lld %lld\n",m-(n-k),m);
        }
        else
        {
            if(n>k)
                printf("%lld %lld\n",m,m-(n-k));
            else
                printf("%lld %lld\n",m-(k-n),m);
        }
    }
    return 0;
}
View Code

后记:最怕的就是找规律,刚开始就是被那张图给吓到了,英语也不好,看不懂题的意思,所以比较怵找规律的题。还是继续努力吧!!!

转载于:https://www.cnblogs.com/zznu17-091041/p/8438700.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值