原題内容不便透露,筆者稍作了修改,題目如下:
有以下輸入和輸出,輸入: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碼,一旦輸入負數代碼就亂套了,這是此段代碼的缺點。優點是輸入控制得比較好,無論你在輸入的時候在數字前後,中間,末尾插入多少空格,數字位數,隻要不超過數組的長度,都能正确的輸入并輸出答案。