9月5日京东笔试题

京东

进制均值

一个数A如果按2到A-1进制表达时,各个位数之和的均值是多少?


输入:整数A(1<=A<=5000)

输出:以X/Y的形式输出结果


思路:直接模拟。把数A按照进制2到A-1进行转化,求和得total。最后对total/(A-2)进行约分,用到一个辗转相除法求最大公约数。


代码如下:

int gcd(int a,int b) {
int temp;
if (a%b==0) return b;
else return gcd(b,a%b);
}


int main() 
{
int i,j,k,n,m,total;


while (scanf("%d",&n)!=EOF) 
{
total = 0;
if (n==2||n==1) {
printf("0/0\n");
continue;
}
for (i=2;i<n;i++) {    //2到n-1进制
m=n;
while (m>0) {
total+=m%i;
m/=i;
}
}
k = gcd(total,n-2); //求最小公约数
printf("%d/%d\n",total/k,(n-2)/k);
}
return 0;
}


合并集合

输入两个集合,输出两个集合合并后的集合。


思路:这个题目很简单,就是一个归并排序的思路。先分别对两个集合排序,再归并就行。


#include <stdio.h>


int a[10001],b[10001];


void qsort1(int h,int t){
int i,j,mid,temp;
i=h;j=t;mid = a[(i+j)/2];
while (i<j)
{
while (a[i]<mid) i++;
while (mid<a[j]&&j>0) j--;
if (i<j) {
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
i++;j--;
}
if (i<t) qsort1(i,t);
if (h<j) qsort1(h,j);
}


void qsort2(int h,int t){
int i,j,mid,temp;
i=h;j=t;mid = b[(i+j)/2];
while (i<j)
{
while (b[i]<mid) i++;
while (mid<b[j]&&j>0) j--;
if (i<j) {
temp = b[i];
b[i] = b[j];
b[j] = temp;
i++;
j--;
}
i++;j--;
}
if (i<t) qsort2(i,t);
if (h<j) qsort2(h,j);
}


int main() {
int i,j,m,n;
while (scanf("%d %d",&m,&n)!=EOF) {
for (i=0;i<m;i++) scanf("%d",&a[i]);
for (j=0;j<n;j++) scanf("%d",&b[j]);
qsort1(0,m-1);         //分别对两个集合进行排序
qsort2(0,n-1);
i=0;j=0;
while (i<m&&j<n) { //进行归并,维护两个下标i和j,小的数字放前面
while (i<m&&a[i]<b[j]) {
printf("%d ",a[i]);
i++;
}
while (j<n&&a[i]>b[j]) {
printf("%d ",b[j]);
j++;
}
while (a[i]==b[j]&&i<m&&j<n) {
printf("%d ",b[j]);
i++;j++;
}
}
for (;i<m;i++) printf("%d ",a[i]);       //进行收尾工作,当一个集合结束了,另一个集合很可能没结束
for (;j<n;j++) printf("%d ",b[j]);
printf("\n");
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值