1 条题解

  • 0
    @ 2025-4-10 16:38:45

    说明

    该程序模拟了冈瓦纳电信公司的通话计费系统,根据通话距离和时段的不同,按照不同的费率计算通话费用。程序读取输入的通话记录,计算各时段的通话分钟数及总费用,并格式化输出结果。

    算法标签

    • 模拟
    • 时间处理
    • 条件判断

    解题思路

    1. 问题分析:根据通话的起始时间和结束时间,将通话时间划分为不同的时段(白天、晚间、夜间),并根据计费等级(A-E)计算各时段的费用。
    2. 输入处理:读取计费等级、被叫号码、通话起始时间和结束时间。
    3. 时间分段:将通话时间按不同费率时段分割,统计各时段的通话分钟数。
    4. 费用计算:根据各时段的通话分钟数和对应的费率,计算总费用。
    5. 输出结果:格式化输出被叫号码、各时段通话分钟数、计费等级和总费用。

    分析

    • 费率时段划分
      • 白天(8:00-18:00):费率A-E分别为0.10、0.25、0.53、0.87、1.44。
      • 晚间(18:00-22:00):费率A-E分别为0.06、0.15、0.33、0.47、0.80。
      • 夜间(22:00-8:00):费率A-E分别为0.02、0.05、0.13、0.17、0.30。
    • 时间处理:将时间转换为分钟数,便于计算各时段的通话分钟数。
    • 特殊情况处理:通话跨越午夜的情况需要分段计算。

    实现步骤

    1. 初始化费率表:使用结构体数组存储不同计费等级的各时段费率。
    2. 读取输入:循环读取输入数据,直到遇到#结束。
    3. 时间转换:将起始时间和结束时间转换为分钟数。
    4. 时段统计
      • 如果起始时间小于结束时间,直接遍历统计各时段。
      • 如果起始时间等于结束时间,视为24小时通话。
      • 如果起始时间大于结束时间,通话跨越午夜,需分段统计。
    5. 费用计算:根据统计的各时段分钟数和对应费率,计算总费用。
    6. 输出结果:按格式输出结果。

    代码解释

    • 数据结构
      • price结构体:存储计费等级和各时段费率。
      • s数组:初始化五个计费等级的费率。
    • 输入处理
      • 读取计费等级、被叫号码、起始时间和结束时间。
      • 将时间转换为分钟数以便处理。
    • 时段统计
      • 使用getprice函数判断当前分钟所属时段,并统计各时段分钟数。
      • 处理通话跨越午夜的情况。
    • 费用计算:根据各时段分钟数和费率累加总费用。
    • 输出:格式化输出被叫号码、各时段分钟数、计费等级和总费用。

    该程序通过精确的时间分段和费率计算,高效地模拟了通话计费过程,并正确输出了各次通话的费用详情。

    代码

    #include<iostream>
    #include<stdio.h>
    typedef struct price{
        char step;
        double a;
        double b;
        double c;
    }price;
    price s[5]={
        {'A',0.10,0.06,0.02 },
        {'B',0.25,0.15,0.05},
        {'C',0.53,0.33,0.13},
        {'D',0.87,0.47,0.17},
        {'E',1.44,0.80,0.30}};
    char phone_number[8];
    char tt;
    int sh,sm,eh,em;
    int startindex;
    int endindex;
    int a,b,c;
    inline double getprice(int i,int index)
    {
        //printf(" %d\n",i);
        if(i<=480){c++;return s[index].c;}
        if(480<i&&i<=1080){a++;return s[index].a;}
        if(1080<i&&i<=1320){b++;return s[index].b;}
        if(i>1320){c++;return s[index].c;}
    }
    int main(int argc, char *argv[])
    {
        //freopen("1.in","r",stdin);
        scanf("%c",&tt);
        while(tt!='#'){
            char cc=tt;
            scanf("%s",phone_number);
            scanf("%d %d %d %d",&sh,&sm,&eh,&em);
            a=b=c=0;
            int index=0;
            for(;index<5;++index)
            {
                if(s[index].step==cc)
                    break;
            }
            int E=eh*60+em;
            int S=sh*60+sm;
            double sum=0;
            if(S<E){
                for(int i=S+1;i<=E;++i)
                {
                    sum+=getprice(i,index);
                }
            }
            else if(S==E)
            {
                for(int i=S+1;i<=1440;++i)
                    sum+=getprice(i,index);
                for(int i=1;i<=E;++i)
                    sum+=getprice(i,index);
            }
            else
            {
                for(int i=S+1;i<=1440;++i)
                    sum+=getprice(i,index);
                for(int i=1;i<=E;++i)
                    sum+=getprice(i,index);
            }
            printf("%10s%6d%6d%6d%3c%8.2lf\n", phone_number, a, b,c, cc, sum);
            scanf("\n%c",&tt);
        }
        return 0;
    }
    • 1

    信息

    ID
    216
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者