C語言程序設計100例之(72):細菌繁殖


例72  細菌繁殖

問題描述

一種細菌的繁殖速度是每天成倍增長。例如:第一天有10 個,第二天就變成20 個,第三天變成40 個,第四天變成80 個,……。現在給出第一天的日期和細菌數目,編寫程序求出到某一天的時候,細菌的數目。

輸入

第一行有一個整數n,表示測試數據的數目。其后n 行每行有5 個整數,整數之間用一個空格隔開。第一個數表示第一天的月份,第二個數表示第一天的日期,第三個數表示第一天細菌的數目,第四個數表示要求的那一天的月份,第五個數表示要求的那一天的日期。已知第一天和要求的一天在同一年並且該年不是閏年,要求的一天一定在第一天之后。數據保證要求的一天的細菌數目在整數范圍內。

輸出

對於每一組測試數據,輸出一行,該行包含一個整數,為要求的一天的細菌數。

輸入樣例

2

1 1 1 1 2

2 28 10 3 2

輸出樣例

2

40

        (1)編程思路。

        這題實際上是求給定的兩天之間間隔的天數n,第一天的細菌數乘以2的n次方就是題目的答案。

        使用一個數組將每個月的天數存起來。由於題目已經告訴是非閏年,所以2月份就只有28天,不用考慮閏年的情況。

        求得輸入的兩個日期的天數差,即它們中間間隔的天數n;用第一天的細菌數乘以2 的n 次方等到答案ans,輸出ans即可。

(2)源程序。

#include <stdio.h>

int main()

{

    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};

    int t;

    scanf("%d", &t);

    while (t--)

    {

        int m1, d1, m2, d2, num;

        scanf("%d%d%d%d%d", &m1, &d1, &num,&m2, &d2);

        int i,n=0;

        for (i= m1; i<m2; i++)

        {

           n+=days[i-1];

        }

        n-= d1;

        n+= d2;

        long long ans = num;

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

        {

           ans *= 2;

        }

        printf("%lld\n", ans);

    }

       return 0;

}

習題72

72-1  日歷問題

問題描述

給定從公元2000 年1 月1 日開始逝去的天數,編寫程序求出這一天是哪年哪月哪日星期幾。(提示:2000.1.1. 是星期六)

輸入

輸入包含若干行,每行包含一個正整數,表示從2000 年1 月1 日開始逝去的天數。

輸入最后一行是−1, 不必處理。可以假設結果的年份不會超過9999。

輸出

對每個測試樣例,輸出一行,該行包含對應的日期和星期幾。格式為“YYYY-MM-DD

DayOfWeek”, 其中 “DayOfWeek” 必須是下面中的一個: "Sunday", "Monday",

"Tuesday", "Wednesday", "Thursday", "Friday" and "Saturday“。

輸入樣例

1730

1740

1750

1751

-1

輸出樣例

2004-09-26 Sunday

2004-10-06 Wednesday

2004-10-16 Saturday

2004-10-17 Sunday

        (1)編程思路。

        已知2000 年1 月1 日是星期六,只要用給定的逝去的天數days對7 取模,就可以知道要求的一天是星期幾。

        可以定義一個二維字符數組char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday","Friday"};保存各星期幾的英文名稱,則要求的一天是week[days%7]。

        用變量i和j分別表示要求的日期的年和月。對於給定的逝去的天數days,i從2000年開始循環處理,如果days 大於等於第i年的天數,就從days中減去第i年的天數,然后i加1表示到了下一年,直到days比第i年的天數少,此時i的值就是所求日期的年份;再讓j從0開始循環處理,如果days大於等於第j月的天數,就從days中減去第j個月的天數,直到days比第j月的天數少,此時j+1的值就是所求日期的月份;剩下的days+1就是所求日期的日子。

         (2)源程序。

#include <stdio.h>

int isLeap(int y)

{

    if (y%4!=0 || (y%100==0 && y%400!= 0)) return 0; // 不是閏年

    else return 1;   // 是閏年

}

int main()

{

    char week[7][10]={"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday",

                      "Thursday","Friday"};

    int year[2]={365,366};  // year[0]表示非閏年的天數,year[1]表示閏年的天數。

    int month[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},

                      {31,29,31,30,31,30,31,31,30,31,30,31}};

    int days, dayofweek;

    int i, j;

    while (scanf("%d", &days) && days != -1)

    {

         dayofweek = days % 7;

         for (i=2000; days >= year[isLeap(i)]; i++)

             days-= year[isLeap(i)];

         for (j = 0; days >= month[isLeap(i)][j];j++)

             days -= month[isLeap(i)][j];

         printf("%d-%02d-%02d %s\n", i, j+1, days+1, week[dayofweek]);

    }

       return 0;

}

72-2  特殊日歷計算

問題描述

有一種特殊的日歷法,它的一天和我們現在用的日歷法的一天是一樣長的。它每天有10個小時,每個小時有100分鍾,每分鍾有100秒。10天算一周,10周算一個月,10個月算一年。現在要你編寫一個程序,將我們常用的日歷法的日期轉換成這種特殊的日歷表示法。這種日歷法的時、分、秒是從0開始計數的。日、月從1開始計數,年從0開始計數。秒數為整數。假設 0:0:0 1.1.2000 等同於特殊日歷法的 0:0:0 1.1.0。

輸入

第一行是一個正整數 N ,表明下面有 N 組輸入。每組輸入有一行,格式如下:hour:minute:second day.month.year

表示常規的日期。日期總是合法的。2000 <= year <= 50000。

輸出

每組輸入要求輸出一行。格式如下:mhour:mmin:msec mday.mmonth.myear 是輸入日期的特殊日歷表示方法。

輸入樣例

7

0:0:0 1.1.2000

10:10:10 1.3.2001

0:12:13 1.3.2400

23:59:59 31.12.2001

0:0:1 20.7.7478

0:20:20 21.7.7478

15:54:44 2.10.20749

輸出樣例

0:0:0 1.1.0

4:23:72 26.5.0

0:8:48 58.2.146

9:99:98 31.8.0

0:0:1 100.10.2000

0:14:12 1.1.2001

6:63:0 7.3.6848

        (1)編程思路。

        由於常用的日歷法表示法和這種特殊的日歷表示法一天是一樣長的,因此轉換時年月日和時分秒可以分開計算,不用將天數轉化為秒,直接計算天數即可,秒也是直接計算。

        由於一天是一樣長,這樣常用的日歷法表示法中1天有24小時,轉換為秒數為24*60*60, 特殊的日歷表示法中1天有10小時,轉換為秒數為10*100*100,對應倍數為0.864。

       (2)源程序。

#include <stdio.h>

int isLeap(int y)

{

    if (y%4!=0 || (y%100==0 && y%400!= 0)) return 0; // 不是閏年

    else return 1;   // 是閏年

}

int main()

{

    int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};

    int t;

    scanf("%d",&t);

    while (t--)

    {

        int h1,min1,s1,d1,mon1,y1;

        scanf("%d:%d:%d %d.%d.%d",&h1,&min1,&s1,&d1,&mon1,&y1);

        int i,date=0;

        for (i=2000;i<y1;i++)

        {

            if(isLeap(i))

                date+=366;

            else

                date+=365;

        }

        for (i=0;i<mon1-1;i++)

            date+=month[i];

        if (isLeap(y1)&& mon1>2)  // 當為閏年時,2月加1天

            date++;

        date+=d1-1;

        int y2,mon2,d2,h2,min2,s2;

        y2=date/1000;

        date=date%1000;

        mon2=date/100+1;

        d2=date%100+1;

        int sum=((h1*60*60+min1*60+s1)/0.864);  //  1天長度相等,倍數為0.864

        h2=sum/10000;

        sum=sum%10000;

        min2=sum/100;

        s2=sum%100;

        printf("%d:%d:%d %d.%d.%d\n",h2,min2,s2,d2,mon2,y2);

    }

       return 0;

}

72-3  另一個時區的時間

問題描述

給定北京時間(UTC+8),請求出另一個時區的時間。

輸入

有多個測試用例。輸入的第一行包含一個整數T(1≤T≤106),表示測試用例的數量。

每個測試占1行,每行包含兩個整數a,b(0≤A≤23,0≤B≤59)以及格式為“UTC+X”、“UTC-X”、“UTC+X.Y”或“UTC-X.Y”的字符串s(0≤X、X.Y≤14,0≤Y≤9)。

輸出

對於每個測試,以hh:mm(24小時制)的格式輸出時間。

輸入樣例

3

11 11 UTC+8

11 12 UTC+9

11 23 UTC+0

輸出樣例

11:11

12:12

03:23

         (1)編程思路。

        將輸入字符串UTC后面的時區數值提取出來,和UTC+8時區做差。

        例如,UTC-2與UTC+8 相差-10個時區,如果UTC+8時區的時間為12:25,則UTC-2時區的時間為02:25。

        (2)源程序。

#include <stdio.h>

int main()

{

    int t;

    scanf("%d", &t);

    while(t--)

    {

        int hour,minute;

        char str[10];

              scanf("%d%d%s",&hour,&minute,str);

           int flag;

           if(str[3]=='+') flag=1;

           else flag=-1;

           int x=0,y=0;

           int i;

           for (i=4;str[i]!='\0';i++)

        {

                   if(str[i]=='.') break;

                   x=x*10+str[i]-'0';

           }

           if (str[i]=='.') y=str[i+1]-'0';

           int t=(x*60+y*6)*flag-8*60;

              t=(hour*60+minute+60*24+t)%(60*24);

              printf("%02d:%02d\n",t/60,t%60);

    }

    return 0;

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM