天天看点

C/Python实现的一道笔试题

原题内容不便透露,笔者稍作了修改,题目如下:

有以下输入和输出,输入:1,2,3,4;得到输出:9,8,7,6

    输入:2,5,7,6;得到输出:18,15,13,14

    输入:5,1,3;得到输出:4,8,6

    输入:2,4,3,2,4;得到输出:13,11,12,13,11

    输入:7,8;得到输出:8,7

    输入:5; 得到输出:0

试问输入:2,4,5,1; 得到的输出是什么。

此题乍一看好像没什么思路,其实稍微细心点便容易发现其中规律了,笔者在这题里主要还是练习了对输入数组的控制问题。

废话不多说,看出规律了答案自然出来了,上代码。

#include <stdio.h>
#define USELESSNUM 48
#define SPACE -16
#define ENTER -38
           
int *inputnums(int array[]);

int *solution(int array[]);

void output(int array[]);

int main(void)
{
	int array[100];
	while(1)
		output(solution(inputnums(array)));
	return 0;
}

int *inputnums(int array[])
{
	printf("input your numbers:(postive number only)\n");
	int i(0);
	while((array[i]=getchar()-USELESSNUM)!=ENTER)    i++;
	int j(0);
	int emptypos(0);
	int merge(0);						//计数作用,保存一次需要转换成十进制数的个数
           
int spacecount(0);					//同样是计数,保存最后一次的空格个数
	for(j;j<=i;j++)
	{
		switch(array[j]){
			case SPACE:
				spacecount++;
			break;
			case ENTER:
				array[j-emptypos-spacecount]=ENTER;
			break;
			default:
				if(spacecount)
				{
					int k(j);
					for(k;array[k]!=SPACE&&array[k]!=ENTER;k++)    merge++;
					int l(0);
					if(merge==1)	l=j;
					else 	l=j+merge-1;
					int digit(1);
					int mergesum(0);
					for(l;l>=j;l--)
					{
						mergesum+=array[l]*digit;		//十进制数整合
						digit=digit*10;
					}
					array[j-spacecount-emptypos]=mergesum;		//前面两个变量都在这贡献了作用,使我们算出整合好的数该放的位置
					emptypos+=spacecount+merge-1;			//保存除整合数字后的多余位置数
					spacecount=0;					
					merge=0;
				}
			break;
		}
	}
	return array;
}

int *solution(int array[])								//这就是问题的答案,相信之前没发现规律的同学看一下代码就全知道了。
{
	int len(0);
	int sum(0);
	for(len;array[len]!=ENTER;len++)
	{
		sum+=array[len];
	}
	if(len==1)	return NULL;
	int i(0);
	for(i;i<len;i++)
	{
		array[i]=sum-array[i];
	}
	return array;
}

void output(int array[])
{
	if(array)
	{
		int i(0);
		printf("output: ");
		for(i;array[i]!=ENTER;i++)
			printf("%d ",array[i]);
		printf("\n");
	}
	else printf("output: 0\n");
}
           

以上代码不能在有负数作输入的情况下使用,因为这段代码判断空格和回车的依据是ASCII码,一旦输入负数代码就乱套了,这是此段代码的缺点。优点是输入控制得比较好,无论你在输入的时候在数字前后,中间,末尾插入多少空格,数字位数,只要不超过数组的长度,都能正确的输入并输出答案。