某互联网公司软件开发笔试题(按照二进制中1的个数进行分类)

某互联网公司软件开发笔试题(按照二进制中1的个数进行分类)


题目描述:小A刚学了二进制,他十分激动,为了确定他掌握了二进制,你给他出了这样的一道题:给定N个飞赴整数,将这个N个数字按照二进制下1的个数分类,二进制下1的个数相同的数字属于一类,求最后一共有多少个类的数字?

输入描述:
输入的第一行是一个正整数z(0<z<=10,表示样例个数。对于每一个样例,第一行是一个正整数N(0<N<=100,表示有多少个数字,数字
下一行是N个由空格分隔的非负整数,大小不超过2^32-1
输出描述:
对于每一组样例,输出一个正整数,表示输入的数字一共分几类。

以下是输入以及输出的例程

输入:
1
5
8 3 5 7 2
输出:
3

由于本人也是刚学习c语言的萌新,所以代码写的也很烂,让各位大神笑话了,没办法,毕竟我是一个连c语言的灵魂——指针都没弄清楚的菜鸡,只能接下来一步一步慢慢的去学习了,主要是没空去细致的学习,慢慢来吧,废话不多说,上代码。

本项目的开发平台是基于vs2017,采用c语言编写。

#include <stdio.h>
#include <stdlib.h>
int count1(int n);
void sort(int *a, int l);

int main()
{
	int z;
	printf("please input z:");
	scanf_s("%d", &z);
	int i;
	int c[11];
	for (i = 0; i < z; i++)
	{
		printf("please input c[%d]\n", z);
		scanf_s("%d", &c[i]);
	}
	c[z] = '\0';
	printf("input over\n");
	int t[11][101];
	int j;
	j = 0;
	int u;
	u = 0;
	while (c[j] != '\0')
	{	
		for (i = 0; i < c[j]; i++)
		{
			printf("please input t[%d][%d]\n", u, i);
			scanf_s("%d", &t[u][i]);
		}
		u++;
		j++;
	}
	int f[10][101];
	for (i = 0; i < z; i++)
	{
		for (j = 0; j < c[i]; j++)
		{
			f[i][j] = count1(t[i][j]);
		}
		f[i][j] = '\0';
	}
	int k;
	k = 0;
	int a;
	int p[11];
	for (i = 0; i < z; i++)
	{
		sort(f[i],c[i]);
	}
	for (i = 0; i < z; i++)
	{	
		a = 1;
		for (j = 0; j+1 < c[i]; j++)
		{
			if (f[i][j] - f[i][j + 1] != 0)
			{
				a++;
			}
		}
		p[i] = a;
	}
	for (i = 0; i < z; i++)
	{
		printf("%d\n", p[i]);
	}
	//s = getchar();
	system("pause");

	return 0;
}

int count1(int n) {
	int res = 0;
	while (n != 0) {
		res += n & 1;
		n>>=1;
	}
	return res;
}

void sort(int *a, int l)//a为数组地址,l为数组长度。
{
	int i, j;
	int v;
	//排序主体
	for (i = 0; i < l - 1; i++)
		for (j = i + 1; j < l; j++)
		{
			if (a[i] > a[j])//如前面的比后面的大,则交换。
			{
				v = a[i];
				a[i] = a[j];
				a[j] = v;
			}
		}
}

以上代码写的真的很乱,我都看不下去了,都不好意思贴出来,但是还是想分享下,希望各位大神提出宝贵修改意见。

猜你喜欢

转载自blog.csdn.net/qq_36662353/article/details/99288736
今日推荐