自然数与有理数的双射函数

 N:自然数, Q:有理数,构造双射函数(双射函数概念请看离散数学) 

 

输入:多行,每行两个整数a和b,中间有一个空格,表示一个有理数a/b

输出:对应的多行,每行一个整数,有理数a/b的双射函数对应的自然数,结果<100000

输入样例:

-2 1

-4 1

-1 2

输出样例:

5

19

3

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
struct fraction{
    int a;
    int b;
};
int isSimplest(int a,int b){//判断是否是最简分数
    int q;
    q = a%b;
    while(q>0) {
        a = b;
        b = q;
        q = a%b;
    }
    if(b==1)
        return 1;
    else
        return 0;
}
int main() {
    vector<fraction> v;
    fraction f;
    f.a=0;  f.b=1;
    v.push_back(f); 
    for(int i=1;i<=600;i++){        
        for(int j=1;j<=i+1;j++){ 
            if(isSimplest(i,j)){ 
                i%2?f.a=i:f.a=-i;
                f.b=j;
                v.push_back(f);
            }
        }
        for(int j=i-1;j>=1;j--){
            if(isSimplest(j,i+1)){
                i%2?f.a=j:f.a=-j;
                f.b=i+1;
                v.push_back(f);
             }
        }
        for(int j=1;j<=i-1;j++){
            if(isSimplest(j,i+1)){
                i%2?f.a=-j:f.a=j;
                f.b=i+1;
                v.push_back(f);
            }
        }
        for(int j=i+1;j>=1;j--){
            if(isSimplest(i,j)){
                i%2?f.a=-i:f.a=i;
                f.b=j;
                v.push_back(f);
            }
        }       
    } 

    int a,b;
    while(cin>>a>>b){
        for(int i=0;i<v.size();i++){
            if(v[i].a==a && v[i].b==b)
                cout<<i<<endl;
        }
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值