您的位置:首页 > 其它

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

2013-08-28 16:41 239 查看
1430. 素数判断
题目描述 Description
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。
注:(1)1既不是质数也不是合数。因为它的约数有且只有1这一个约数。
(2)2和3是所有素数中唯一两个连着的数 .
输入描述
第一行输入一个正整数n,n<=30000
输出描述
如果该数是质数,则输出\t
否则输出\n
代码:记住一个范围就好sqrt(n),其他就是输出\n和\t,因为\转义字符的缘故这里要输出的东西前面加上\

#include<iostream>
#include<cmath>
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<iostream>
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<iostream>
#include<cmath>
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<<i*x<<","<<x<<endl;
num++;
}
else{
//cout<<i*x<<","<<x*n/i<<endl;
//cout<<x*n/i<<","<<i*x<<endl;
num+=2;
}
}
}
cout<<num;
}


1475 m进制转十进制

题目描述 Description

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

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

输入描述

共一行

n和m

输出描述

共一个数

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

#include<iostream>
#include<string>
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<iostream>
#include<vector>
#include<cmath>
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');
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: