您的位置:首页 > 编程语言 > Python开发

C/Python实现的一道笔试题

2016-07-05 20:37 369 查看
原题内容不便透露,笔者稍作了修改,题目如下:

有以下输入和输出,输入: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码,一旦输入负数代码就乱套了,这是此段代码的缺点。优点是输入控制得比较好,无论你在输入的时候在数字前后,中间,末尾插入多少空格,数字位数,只要不超过数组的长度,都能正确的输入并输出答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 笔试题 输入