天梯题目解答--通过初赛 3数论-4进制转换

1430. 素数判断

题目描述 Description

质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。

注:(1)1既不是质数也不是合数。因为它的约数有且只有1这一个约数。

(2)2和3是所有素数中唯一两个连着的数 .

输入描述

第一行输入一个正整数n,n<=30000

输出描述

如果该数是质数,则输出\t

否则输出\n

代码:记住一个范围就好sqrt(n),其他就是输出\n和\t,因为\转义字符的缘故这里要输出的东西前面加上\

#include
#include
using namespace std;
int main(){
	int n;
    cin>>n;
    if(n==1){
        cout<<"\\n";
        return 0;
    }
    for(int i=2;i<=sqrt(n);i++){
        if(0==n%i){
            cout<<"\\n";
            return 0;
        }   
    }
    cout<<"\\t";
}

1212 最大公约数

题目描述 Description

求两个数A和B的最大公约数。 1<=A,B<=2^31-1

输入描述

两个整数A和B

输出描述

最大公约数gcd(A,B)

 我的代码

#include
using namespace std;
template <typename T>
T gcd(T a, T b){
    if(a<b){
        a = a^b;
        b = a^b; 
        a = a^b;
    }
    if(0==a%b)
        return b;
    else
        return gcd(a-b,b);
}
int main(){
    int a,b;
    cin>>a>>b;
    cout<<gcd(a,b);
}

不过我这样还不是最简单的 ,因为每次都是a-b实际上还是很慢的,如果用上余数那么就应该是最简单的了

int Gcd(int a, int b)
{
     if(b == 0)
        
return a;
    
return Gcd(b, a % b);
}

1012 最大公约数和最小公倍数问题

题目描述 Description

输入二个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数

条件:  1.P,Q是正整数

2.要求P,Q以x0为最大公约数,以y0为最小公倍数.

试求:满足条件的所有可能的两个正整数的个数.

输入描述

二个正整数x0,y0

输出描述

满足条件的所有可能的两个正整数的个数

代码主要需要注意的是:当x,y存在0或者不能够整除的时候直接是0输出,之后的计算可以这样想,因为x为公约数,y为公倍数,那么y/x能够整除,且p,q两个数除以公约数x后的结果相乘应该等于y/x,同时p/x和q/x不应该有除了1之外的公约数,因为如果有,假设为m,那么p,q的公约数就应该为x*m,此外,这里还牵扯一个交换问题,就是p!=q的时候,可以交换p q

#include
#include
using namespace std;
template <typename T>
T Gcd(T a, T b){
     if(b == 0)
        return a;
    return Gcd(b, a % b);
}
int main(){
    int x,y;
    cin>>x>>y;
    if((0==x||0==y) || 0!=y%x || y<x) {cout<<0; return 0;}
    int n=y/x,num=0;
    for(int i=1;i<=sqrt(n);i++){
        if(0==n%i && gcd(n/i,i)==1){
            if(n/i==i){
                //cout<
            	num++;
            }
            else{
                //cout<
                //cout<
            	num+=2;
            }
        }
    }
    cout<<num;
}

1475 m进制转十进制

题目描述 Description

将m进制数n转化成一个十进制数 m<=16

题目保证转换后的十进制数<=100

输入描述

共一行

n和m

输出描述

共一个数

表示m进制的n化成十进制的数

#include
#include
using namespace std;
int main(){
    
    string n;
    int m;
    cin>>n>>m;
    if(0==m){cout<<0; return 0;}

    int sum = 0;
    for(int i=0;i<n.length();i++){
        if(n[i]<='9' && n[i]>='0')
            sum = sum*m+(n[i]-'0');
        else
            sum = sum*m+(n[i]-'A'+10);
    }
    cout<<sum;
}


1474 m进制转十进制

题目描述 Description

将m进制数n转化成一个十进制数 m<=16

题目保证转换后的十进制数<=100

输入描述

共一行

n和m

输出描述

共一个数

表示n的m进制

显示逆序求的转化的数值,然后再输出,注意输出10以上的时候转换为A~F

#include
#include
#include
using namespace std;
int main(){
    int n,m;
	cin>>n>>m;
    vector<int> pout;
    int t;
    while(n>0){
        t = n%m;
        pout.push_back(t);
        n = n/m;
    }
    for(int i=pout.size()-1;i>=0;i--){
        if(pout[i]>=0 && pout[i]<=9)
            cout<<pout[i];
        else
            cout<<(char)(pout[i]-10+'A');
    }
}


你可能感兴趣的:(C/C++)