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;
}
代码供参考。