ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C语言程序设计100例之(72):细菌繁殖

2022-03-06 14:01:58  阅读:389  来源: 互联网

标签:10 UTC int 31 30 days C语言 72 100


例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;

}

标签:10,UTC,int,31,30,days,C语言,72,100
来源: https://www.cnblogs.com/cs-whut/p/15971533.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有