今日头条2017年秋招编程题“最大”点集

这里写图片描述

#coding = utf-8
#输入n的坐标点,找不出比它同时X和Y轴都大的点,即输出
#例子:输入n为5
#然后每行入一个点的坐标:2 4                              下一行输入 4 5                          依次内推 6 3                  1 8                                2 0        
#输出满足条件的坐标  按横坐标排序由小到大输出坐标点
import sys
if __name__ == "__main__":
    n=int(sys.stdin.readline().strip())
    pointX=[]
    pointY=[]
    resList=[]
    for k in range(n):
        line = sys.stdin.readline().strip()
        pointX.append(line.split()[0])
        pointY.append(line.split()[1])
    print "输出结果按X排序,如上则输出为:"
#从第一个值开始,与它后面的值比较,有比它X和Y同时大的,则退出,接着从第二值开始,与它后面的值比较,如果没有比它同时XY都大的,则满足条件
    for i in range(n):
        for j in range(i+1,n):
                if(pointX[i]<pointX[j]) and (pointY[i]<pointY[j]):
                    break
                else:
                    if(j==(n-1)):
                        resList.append(list(str(pointX[i])+str(pointY[i])))
                    else:
                        continue
#最后一值比较与它前面的值进行比较
    for k in range(n-1):
        if(pointX[n-1]<pointX[k]) and (pointY[n-1]<pointY[k]):
            break
        else:
            if(k==(n-2)):
                resList.append(list(str(pointX[n-1])+str(pointY[n-1])))
            else:
                    continue
    resList.sort(key=lambda x:x[0]) #按key排序,value对应变化
    for m in range(len(resList)):
        print  ("%s %s" %(resList[m][0],resList[m][1]))

结果如下截图:
这里写图片描述

python新手,代码没有做优化,目前先实现功能,如果有问题或错误之处,请留言指正,谢谢~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要求解椭圆曲线上的点集,首先需要定义椭圆曲线的参数,包括有限域Fp上的参数p、a、b和椭圆曲线上的基点G的坐标(x,y)。然后采用椭圆曲线上的加法运算,循环计算椭圆曲线上所有可能的点,直到出现无穷远点为止。 以下是一个简单的C++程序,可以实现求解椭圆曲线上的点集: ``` #include <iostream> #include <gmpxx.h> //需要引入gmp库 using namespace std; const mpz_class p("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); //有限域Fp上的参数p const mpz_class a("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2C"); //椭圆曲线参数a const mpz_class b("0x0000000000000000000000000000000000000000000000000000000000000003"); //椭圆曲线参数b const mpz_class x("0x6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296"); //基点G的x坐标 const mpz_class y("0x4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5"); //基点G的y坐标 mpz_class mod_inverse(mpz_class a, mpz_class n) //求逆元函数 { mpz_class x, y, gcd; mpz_gcdext(gcd.get_mpz_t(), x.get_mpz_t(), y.get_mpz_t(), a.get_mpz_t(), n.get_mpz_t()); //使用gmp库中的扩展欧几里得算法求逆元 if (gcd != 1) return 0; else return (x % n + n) % n; } class Point //定义椭圆曲线上的点类 { public: mpz_class x, y; Point() {} Point(mpz_class _x, mpz_class _y) { x = _x; y = _y; } }; Point operator +(Point p1, Point p2) //椭圆曲线上的加法运算 { Point p; mpz_class lambda; if (p1.x == p2.x && p1.y == p2.y) //点p1与点p2相等,即点p1为自己的相反点 { mpz_class inv = mod_inverse(2 * p1.y, p); //求逆元 if (inv == 0) return Point(0, 0); //不存在逆元 lambda = (3 * p1.x * p1.x + a) * inv; //计算斜率 } else //点p1与点p2不相等 { mpz_class inv = mod_inverse(p2.x - p1.x, p); //求逆元 if (inv == 0) return Point(0, 0); //不存在逆元 lambda = (p2.y - p1.y) * inv; //计算斜率 } p.x = (lambda * lambda - p1.x - p2.x) % p; //计算新点的x坐标 p.y = (lambda * (p1.x - p.x) - p1.y) % p; //计算新点的y坐标 return p; } int main() { Point G(x, y), P = G; //定义基点G和当前点P cout << "椭圆曲线上的点为:" << endl; cout << "(" << G.x << ", " << G.y << ")" << endl; //输出基点G for (int i = 1; i < 16; i++) //循环计算椭圆曲线上的点 { P = P + G; //点加运算 cout << "(" << P.x << ", " << P.y << ")" << endl; //输出当前点P } return 0; } ``` 该程序中,使用了gmp库中的mpz_class类,可以处理任意大小的整数。定义了椭圆曲线上的点类Point,以及椭圆曲线上的加法运算,使用循环计算椭圆曲线上的所有点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值