某公司的一道面试题(c语言编程实现)

1.只给两小时时间。


2.编程试题:

对于一个 32 位无符号整数 a,有如下定义:
W2(a)=整数 a 的二进制重量。
例子:
W2(31)=5(0b11111),W2(4)=1(0b100)
W10(a)=整数 a 的十进制重量。
例子:
W2(31)=4(3+1),W(101)=2(1+0+1)
W16(a)=整数 a 的十六进制重量。
例子:
W16(31)=6(31->0x1F->(’1’-‘0’)+(‘F’-’A’))
W16(154)=9(154->0x9A->(‘9’-‘0’)+(‘A’-‘A’))
对于两个 32 位无符号整数 a,b,有如下定义:
Dn(a,b)=整数 a,b 之间的 n 进制距离
整数 a,b 的 n 进制距离的定义: 首先将整数 a,b 分别化成 n 进制进行表示,然后将 n 进制表
示下的对应位数值进行比较取差值,然后求和,得到 a,b 之间的 n 进制距离。
例子:D2(31,4)=D2(0b11111,0b00100)=4
D2(100,10)=D2(0b1100100, 0b0001010)=5
D10(31, 4)=D10(31, 04)=6((3-0)+abs(1-4))
D10(100,10)=D10(100,010)=2(1-0+abs(0-1))
D16(31, 4)=D16(0x1F, 0x04)=12(0x1-0x0+0xF-0x4)
D16(100,10)=D16(0x64,0x0A)=12(0x6-0x0+abs(0x4-0xA))
对于给定的具有 8 个 32 位整型元素的数组,编程完成以下问题:
a. 计算数组元素中每一个元素 W2,W10,W16 的值并打印到屏幕上。
b. 计算数组中每一对元素之间 D2 的总和,并打印到屏幕上。
c. 计算数组中每一对元素之间 D10 的总和,并打印到屏幕上。
d. 计算数组中每一对元素之间 D16 的总和,并打印到屏幕上。
e. 根据数组中每个元素的 W10 值大小,使用数组内的元素创建一个双向有序链表(一个
升序,一个降序),并按降序输出排序后的数组元素到屏幕上。
f. 将数组划分成两个子数组 P1,P2,每个子数组具有 4 个元素,使得划分后的数组满足条
件:分别针对数组 P1,P2 中每个元素计算 W16 的值,使得两个数组的 W16 之和差值的
绝对值最大。输出 P1,P2 数组元素到屏幕上
g. 将数组划分成两个子数组 P1,P2,每个子数组具有 4 个元素,使得划分后的数组满足条
件:分别针对数组 P1,P2 中每个元素计算 W16 的值,使得两个数组的 W16 之和差值的
绝对值最小。输出 P1,P2 数组元素到屏幕上
3. 控制台 程序 交互框架 要求
控制台程序要求支持键盘输入 0-8 数字按键,数字 1,2,3 代表当前选取的用来进行处理
数组的方法,数字 4 完成问题 a 的功能,数字 5 完成问题 b,c,d 的功能,数字 6 完成问题 e
的功能,数字 7 完成问题 f 的功能,数字 8 完成问题 g 的功能,数字 0 退出控制台程序。如
果未能完成按键对应的功能,则请打印输出“该功能未能实现”。控制台程序运行期间,可以
反复输入 1-8 数字,完成对应功能,请确保每次按键输入都可以在屏幕上输出正确的运行结
果。
程序运行后,必须要先输入 1-3 中任意一个数字生成 8 个元素的数组并打印到屏幕上,
后续操作都在此生成数组上进行。如果没有生成 8 个元素的数组,则后续功能按键输入(4-
8)都请打印输出“请先选择按键 1-3 生成数组”。
8 个元素数组的生成方法:
按键 1 的生成方法为按给定下标组从数字池中选取数字组成数组。下标组为
[12,8,0,19,23,7,5,9]。
按键 2 的生成方法为随机生成一个 0-10 内的整数,并以这个整数作为起始下标,连续
从数字池取 8 个元素组成数组。
按键 3 的生成方法为随机从数字池的 24 个元素中选取 8 个元素组成数组,原始数据池
中的每个元素不能被选取一次以上。
数字池 unsigned int pool[24]={
29, 18, 61, 479, 2033, 4587, 22310, 79,
565, 100211, 643, 1085, 8001, 786, 98, 911,
15, 109, 2021, 877, 243, 56, 908, 3004};


#include<stdio.h>
#include<math.h>
#define MAX 8 //8个元素 
#include<stdlib.h>
#include<time.h>

int binary(int num,int jinzhi)
{	
	int count=0;
	while(num)					
	{	
		int a=num%jinzhi;
		num=num/jinzhi;
		//binary(num,jinzhi);		// 求余数、商 
		if(a>=10)
		{
			a-=10;
		} 
		count+=a;
		
	}
	
	return count;

} 
int binary2(int num1,int num2,int jinzhi)	//D2 D16 D10 
{	
	int count1=0;
	while(num1 || num2)					
	{	
			
		int a1=num1%jinzhi;
		num1=num1/jinzhi;
		int a2=num2%jinzhi;
		num2=num2/jinzhi;
		int num=abs(a1-a2);
		
		count1+=num; 
	}
	return count1;
} 
int D2(int n1,int n2)
{
	return binary2(n1,n2,2);
}
int D10(int n1,int n2)
{
	return binary2(n1,n2,10);
}int D16(int n1,int n2)
{
	return binary2(n1,n2,16);
}
int W10(int num)
{
	return binary( num,10);
} 
int  W16(int num)
{
	return binary( num,16);
}
int  W2(int num)
{
	return binary( num,2);
} 
typedef struct node
{	
	int data;
	struct node *pre;
	struct node *next;
	
}node,Node[MAX];
void bub1(int *arr,int n)//升序 
{
	int i,j,index;
	for(i=0;i<n-1;i++)
	{	
		index=i;
		for(j=i+1;j<n;j++)
		{
			if(W10(arr[index])>W10(arr[j]))
			{	
				index=j;
			}
		}
		int tmp=arr[i];
		arr[i]=arr[index];
		arr[index]=tmp;
	}
}
//void bub2(int *arr,int n)//降序 
//{
//	int i,j,index;
//	for(i=0;i<n-1;i++)
//	{
//		index=i;
//		for(j=i+1;j<n;j++)
//		{
//			if(W10(arr[index])<W10(arr[j]))
//			{	
//				index=j;
//			}
//		}
//		int tmp=arr[i];
//		arr[i]=arr[index];
//		arr[index]=tmp;
//	}
//	printf("降序:"); 
//	for(i=0;i<n;i++)
//	{
//		printf("%d ",arr[i]);
//	}
//	putchar(10);
//}
void bub3(int *arr,int n)//16进制的降序 
{
	int i,j,index;
	for(i=0;i<n-1;i++)
	{	
		index=i; 
		for(j=i+1;j<n;j++)
		{
			if(W16(arr[index])<W16(arr[j]))
			{	
				index=j;
			}
		}
		int tmp=arr[i];
		arr[i]=arr[index];
		arr[index]=tmp;
	}
}
int main(void)
{	
	int i=0;
	int n=8;
	int arr[8]={12,8,0,19,23,7,5,9};
	while(1)
	{
		srand(time(NULL));
		//int arr[n];
		printf("请输入数字1~8选择模式:");
		int number;
		scanf("%d",&number);
		if(number==88)//输入88退出程序 
		{
			break;
		}
		
		unsigned int pool[24]={29, 18, 61, 479, 2033, 4587, 22310, 79,565, 100211, 643, 1085, 8001, 786, 98, 911,15, 109, 2021, 877, 243, 56, 908, 3004};
		int index=rand()%10;
		int label[24];
		int a,b,c;
		node *L=(node*)malloc(sizeof(node)); 
			//	node *head1=(node*)malloc(sizeof(node)); 
			//	node *head2=(node*)malloc(sizeof(node)); 
		node *p;
		node *q;
		int P1[4];
		int P2[4];
		int j=0;
		int k=0;
		switch(number)
		{
			case 1:
				printf("数组元素为: "); 
				for(i=0;i<8;i++)
				{
					printf("%d ",arr[i]);
				}
				i=1;
				putchar(10); 
				break;
			case 2:
				printf("数组元素为: "); 
				for(i=0;i<8;i++)
				{	
					arr[i]=pool[i+index];
					printf("%d ",arr[i]);
				}
				i=2;
				putchar(10); 
				break;
			case 3:
				printf("数组元素为: "); 
				for(i=0;i<24;i++)
				{
					label[i]=0;
				}
				for(i=0;i<8;i++)
				{	
					int t=rand()%24;
					//label[i]=0;
					while(label[t])
					{
						t=rand()%24;
					}
					arr[i]=pool[t];
					label[t]=1;
				}
				for(i=0;i<8;i++)
				{
					printf("%d ",arr[i]);
				}
				putchar(10); 
				i=3;
				break;
			case 4:
				if(i==0)
				{
					printf("请先选择按键 1-3 生成数组\n");
					break;
				}
				for(i=0;i<8;i++)
				{
					int a=W2(arr[i]);
					int b=W10(arr[i]);
					int c=W16(arr[i]);
					printf("arr[%d]:w2:%d w10:%d w16:%d\n",i,a,b,c);
				}
				putchar(10); 
				break;
			case 5:
				if(i==0)
				{
					printf("请先选择按键 1-3 生成数组\n");
					break;
				}
				a=b=c=0;			
				for(i=0;i<n-1;i++)
				{
					a+=D2(arr[i],arr[i+1]);
					b+=D10(arr[i],arr[i+1]);
					c+=D16(arr[i],arr[i+1]);
					printf("总和:D2:%d D10:%d D16:%d\n",a,b,c);
				}
				break;
			case 6:
				if(i==0)
				{
					printf("请先选择按键 1-3 生成数组\n");
					break;
				}
			
				bub1(arr,8);
				for(i=0;i<n;i++)
				{
					printf("%d ",arr[i]);
				}
				putchar(10);
				p=(node* )malloc(sizeof(node));
				p=L;
				L->next=NULL;
				L->pre=NULL;
				L->data=arr[0];
				for(i=1;i<n;i++)
				{	
					q=(node* )malloc(sizeof(node));
					q->next=NULL;
					q->data=arr[i];
					q->pre=p; 
//					if(i==0)
//					{
//						L->next=p;
//					}
					p->next=q;
					p=q;
//					p->next=q->next;
//					q=q->next;
					
				}
				if(p->next==NULL)
				{
					L->pre=p;	
				}
				printf("降序:"); 
				for(p=L->pre,i=0;p&&i<MAX;i++,p=p->pre)
				{
					printf("%d ",p->data);
				}
				putchar(10);	

				break;
			case 7:
				if(i==0)
				{
					printf("请先选择按键 1-3 生成数组\n");
					break;
				}
				bub3(arr,8); 
				for(i=0;i<8;i++)
				{
					if(i<4)
					{
						P1[i]=arr[i];
						j+=W16(P1[i]);
					}
					else
					{
						P2[i-4]=arr[i];
						k+=W16(P2[i-4]);
					}
				}
				for(i=0;i<4;i++)
				{
					printf("P1:%d ",P1[i]);
				}
				putchar(10);
				for(i=0;i<4;i++)
				{
					printf("P2:%d ",P2[i]);
				}
				putchar(10);
				break;
			case 8:
                //当时不理解最后一个功能是什么意思,我的思路是取余%2,等于0的进P1,剩下的给P2
				printf("没有完成!"); 
				putchar(10);
				break;
			default:
				printf("请输入1-8之间的数值"); 
				putchar(10);
				break; 
		}	
	}
	return 0;
}

代码供参考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值