天天看點

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碼,一旦輸入負數代碼就亂套了,這是此段代碼的缺點。優點是輸入控制得比較好,無論你在輸入的時候在數字前後,中間,末尾插入多少空格,數字位數,隻要不超過數組的長度,都能正确的輸入并輸出答案。