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;im=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


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{
while (a[i]while (mid0) j--;
if (itemp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
i++;j--;
}
if (iif (h }


void qsort2(int h,int t){
int i,j,mid,temp;
i=h;j=t;mid = b[(i+j)/2];
while (i{
while (b[i]while (mid0) j--;
if (itemp = b[i];
b[i] = b[j];
b[j] = temp;
i++;
j--;
}
i++;j--;
}
if (iif (h }


int main() {
int i,j,m,n;
while (scanf("%d %d",&m,&n)!=EOF) {
for (i=0;ifor (j=0;jqsort1(0,m-1);         //分别对两个集合进行排序
qsort2(0,n-1);
i=0;j=0;
while (i //进行归并,维护两个下标i和j,小的数字放前面
while (iprintf("%d ",a[i]);
i++;
}
while (jb[j]) {
printf("%d ",b[j]);
j++;
}
while (a[i]==b[j]&&iprintf("%d ",b[j]);
i++;j++;
}
}
for (;ifor (;jprintf("\n");
}
return 0;
}

你可能感兴趣的:(编程)