京东
进制均值
一个数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;
}