1题目背景
从哪里跌倒就要从哪里爬起来!!!
上次给学弟学妹们出进制转换,居然没有一个人AC!于是这一次,心情绝望的学长决定出一回水水的进制转换作为这场考试的第一道水题。
(当然,也可能是唯一一道)
题目描述
作为迷你版进制转换,测试数据将给出一个十进制数据,你只需要编写程序输出这个十进制数据的二进制,八进制和十六进制表示。
注意:十六进制中10至15分别由A,B,C,D,E,F六个大写字母表示。
输入格式
一行,一个十进制正整数,为待转换的数字。
输出格式
三行,三个整数,分别为输入数据的二进制,八进制和十六进制表示。
样例一
input
27
output
11011
33
1B
限制与约定
对于100%的数据,输入的十进制数据在无符号的INT 范围内
递归解法
#include<cstdio>
#include<iostream>
using namespace std;
char MAP[6] = {
'A', 'B', 'C', 'D', 'E', 'F'};
long long in;
void change(long long aim, long long sys){
if(aim){
change(aim/sys, sys);
int t = aim%sys;
if(t>=10) cout << MAP[t-10];
else cout << t;
}
}
int main(void){
// freopen("change10.in", "r", stdin);
// freopen("change10.out", "w", stdout);
cin >> in;
change(in, 2);
cout << endl;
change(in, 8);
cout << endl;
change(in, 16);
}
法三定义函数
#include<iostream>
using namespace std;
unsigned int num;
void zh(unsigned int num, int k){
int ws=0, d[40]={
0};
while(num){
d[ws++]=num%k;
num/=k;
}
ws--;
for(int i=ws; i>=0; i--){
if(d[i]<=9) cout<<d[i];
if(d[i]==10) cout<<'A';
if(d[i]==11) cout<<'B';
if(d[i]==12) cout<<'C';
if(d[i]==13) cout<<'D';
if(d[i]==14) cout<<'E';
if(d[i]==15) cout<<'F';
}
cout<<endl;
}
int main(){
cin>>num;
zh(num, 2);
zh(num, 8);
zh(num, 16);
return 0;
}
函数解法
#include<iostream>
#include<cstdio>
using namespace std;
int a[50];
void f(long long n){
int m=0;
for(int j=1;j<=50;j++){
int d=0;
d=n%2;
if(n!=0) {a[j]=d;
m++;}
n/=2;}
for(int i=m;i>=1;i--)
cout<<a[i];
cout<<endl;
}
int main(){
long long n;
cin>>n;
f(n);
printf("%o\n",n);
printf("%X\n",n);
}
我的解法 比较长 忘了怎么定义函数 主要是忘了格式 汗!
#include<iostream>
#include<string>
using namespace std;
int s[1000010];
int main()
{
long long n;
cin>>n;
long long x,y,z;
for(int i=2;i<=16;i+=2)
{
if(i==2)
{
x=n;
long long c,m=0;
while(x!=0)
{
c=x%2;
x=x/2;
s[m]=c;
m++;
}
for(int i=m-1;i>=0;i--)
{
if(s[i]>=10) cout<<(char)(s[i]+55);
else cout<<s[i];
}
cout<<endl;
}
if(i==8)
{
y=n;
long long c,m=0;
while(y!=0)
{
c=y%8;
y=y/8;
s[m]=c;
m++;
}
for(int i=m-1;i>=0;i--)
{
if(s[i]>=10) cout<<(char)(s[i]+55);
else cout<<s[i];
}
cout<<endl;
}
if(i==16)
{
z=n;
long long c,m=0;
while(z!=0)
{
c=z%16;
z=z/16;
s[m]=c;
m++;
}
for(int i=m-1;i>=0;i--)
{
if(s[i]>=10) cout<<(char)(s[i]+55);
else cout<<s[i];
}
cout<<endl;
}
}
return 0;
}
2问题描述
众所周知,数学和OI是密切相关的,数学不仅是OI的基础,而且是算法的核心。因此,学习数论对于OIer们十分重要()。
在数论中,有一个叫做欧拉函数的东西,它的定义是这样的:对于正整数nn,欧拉函数是小于或等于nn的正整数中与nn互质的数的数目。我们特定1的欧拉函数值为1,即φ(1)=1φ(1)=1。(互质,若两个整数的最大公因数是1,则称这两个整数互质。)
现在我们设定一个概念,对于一个正整数nn,它满足φ(n)=n−1φ(n)=n−1,我们把这样的数称为AZe数。
现在AZe想问你,给出一个正整数mm,在闭区间[1,m][1,m]中,一共有多少个AZe数,区间内AZe数的极差是什么。(极差=最大值-最小值)
输入格式
一行一个正整数mm。
输出格式
一行两个正整数,用空格隔开,分别代表区间内AZe数的数量,极差。
样例
input
10
output
4 5
数据范围与约定
对于70%的数据,2≤m≤800002≤m≤80000。
对于100%的数据,2≤m≤100000002≤m≤10000000。
法1
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int P[10000010]={
1,1};
int main(){
int ft,n,cnt=0;
int max=-1,min=20000000;
scanf("%d",&n);
for(int i=2;i<=ceil(sqrt(10000000));++i){
ft=0;
for(int j=2;j<=floor(sqrt(i));++j){
if(i%j==0){
ft=1;
break;
}
}
if(!ft){
for(int j=i*i;j<=10000000;j+=i){
P[j]=1;
}
}
}
for(int i=1;i<=n;++i){
if(!P[i]){
++cnt;
if(i>max) max=i;
if(i<min) min=i;
}
}
cout<<cnt<<" "<<max-min;
return 0;
}
法二 kb的解法
#include<iostream>
#include<cmath>
using namespace std;
bool a[10000010]{
1, 1};
int main(){
for(int i=2; i<=ceil(sqrt(10000005)); i++){
int flag=1;
for(int j=2; j<=floor(sqrt(i)); j++){
if(i%j==0){
flag=0;
a[i]=1;
break;
}
}
if(flag)
for(int j=i*i; j<=10000005; j+=i)
a[j]=1;
}
int n, cnt=0, tmax=-1, tmin=100000;
cin>>n;
for(int i=1; i<=n; i++){
if(a[i]==0){
if(i>tmax)
tmax=i;
if(i<tmin)
tmin=i;
cnt++;
}
}
cout<<cnt<<" "<<tmax-tmin;
return 0;
}
法三
#include<iostream>
using namespace std;
bool is[10000000]={
0};
int zhishu[10000000];
int main(){
int n,cn