三個數字題

一、#713 ─ Adding Reversed Numbers

題目:按這裡

說明:輸入兩個整數,將兩數分別反轉後兩相加,相加後的結果再反轉後輸出。

由於這個程式要做三次的反轉,所以我們把這個反轉的程式部分寫成函數 Rev():

int Rev(int n)

{

 int r=0;

 while(n>0) {

   r=r*10+(n%10);

   n/=10;

 }

 return r;

}

接下來整個程式就很簡單了:

#include <stdio.h>

int Rev(int n)

{

 int r=0;

 while(n>0) {

   r=r*10+(n%10);

   n/=10;

 }

 return r;

}

void main()

{

 int a, b;

 scanf("%d %d", &a, &b);

 a=Rev(a);

 b=Rev(b);

 printf("%d\n",Rev(a+b));

}

最後,這個題目和之前連續輸入的形式不同,它是先輸入一個數字代表要計算的次數,之後每行再輸入我們要計算的兩個數字,所以我們的程式再改成下面的樣子:

#include <stdio.h>

int Rev(int n)

{

 int r=0;

 while(n>0) {

   r=r*10+(n%10);

   n/=10;

 }

 return r;

}

void main()

{

 int a, b, n, i;

 scanf("%d", &n);

 for(i=0; i<n; i++) {

   scanf("%d %d", &a, &b);

   a=Rev(a);

   b=Rev(b);

   printf("%d\n",Rev(a+b));

 }

}

 

二、#579 ─ ClockHands

題目:按這裡

說明:以 HH:MM 的格式輸入一個時間,輸出該時間的時針與分針的夾角(輸出到小數後三位)。

這個題目的輸入格式是 HH:MM 的格式,我們還是可以直接用 scanf("%d:%d", &h, &m) 的方式還讀取輸入的資料。接下來計算完時針與分針各別的角度求兩者的差,並用下面的規則處理:

  1. 如果這個值小於 0,則將它的負號拿掉。
  2. 如果這個值大於 360,則將它減去 360。
  3. 如果這個值大於 180,則以 360 減去該值。

我們把這些想法寫成程式:

#include <stdio.h>

void main()

{

 int h, m;

 float dh, dm, d;

 scanf("%d:%d", &h, &m);

 dm=m*6;

 dh=h*30+m*0.5;

 d=dh-dm;

 if(d<0) d=-d;

 if(d>=360) d=d-360;

 if(d>=180) d=360-d;

 printf("%.3f\n", d);

}

最後,我們把這個程式改寫成連續輸入的方式,如果輸入 0:00 則程式結束:

#include <stdio.h>

void main()

{

 int h, m;

 float dh, dm, d;

 while(1) {

   scanf("%d:%d", &h, &m);

   if( (h==0) && (m==0) ) break;

   dm=m*6;

   dh=h*30+m*0.5;

   d=dh-dm;

   if(d<0) d=-d;

   if(d>=360) d=d-360;

   if(d>=180) d=360-d;

   printf("%.3f\n", d);

 }

}

 

三、#591 ─ Box of Bricks

題目:按這裡

說明:先輸入一個整數 n,代表下面有幾堆方塊,接下來有 n 個整數分別為這 n 堆方塊的高度,輸出要讓每一堆都一樣高的情況下,要搬動的方塊數 k。

這一題只要算出這幾堆方塊的平均高度,再計算每一堆高度和平均高度的差的總和的一半即可。或者,只要計算比平均高度高的方塊堆的和平均高度差的總和也可以。程式如下:

#include <stdio.h>

void main()

{

 int n, h[50], i, s, k;

 scanf("%d", &n);

 s=0;

 for(i=0; i<n; i++) {

   scanf("%d", &h[i]);

   s+=h[i];

 }

 s/=n;

 k=0;

 for(i=0; i<n; i++)

   if(h[i]>s) k+=(h[i]-s);

 printf("The minimum number of moves is %d.\n", k);

}

最後,我們再改成程式所要求的樣子:

#include <stdio.h>

void main()

{

 int n, h[50], i, s, k, t=1;

 while(1) {

   scanf("%d", &n);

   if(n==0) break;

   s=0;

   for(i=0; i<n; i++) {

     scanf("%d", &h[i]);

     s+=h[i];

   }

   s/=n;

   k=0;

   for(i=0; i<n; i++)

     if(h[i]>s) k+=(h[i]-s);

   printf("Set #%d\n", t++);

   printf("The minimum number of moves is %d.\n\n", k);

 }

}

 

上一頁

首頁

下一頁