埋坑题记录

P5707 【深基2.例12】上学迟到
题目链接:https://www.luogu.com.cn/problem/P5707
题解代码:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int s, v;
    cin >> s >> v; // 输入距离和速度

    // 计算到达学校所需的总时间(分钟),并向上取整
    int cnt = (s + v - 1) / v; // 使用整数运算向上取整
    cnt += 10; // 加上垃圾分类所需的 10 分钟

    // 学校要求到达时间为上午 8:00,转换为分钟
    int latestArrivalTime = 8 * 60; // 8:00 AM 转换为分钟
    int latestDepartureTime = latestArrivalTime - cnt; // 计算最晚出发时间

    // 特判:当最晚出发时间为负数时,表示需要在前一天出发
    if (latestDepartureTime < 0) {
        latestDepartureTime += 24 * 60; // 向前一天回绕
    }

    // 计算最晚出发时间的小时和分钟
    int hours = latestDepartureTime / 60; // 小时
    int minutes = latestDepartureTime % 60; // 分钟

    // 格式化输出小时和分钟,确保为两位数
    printf("%02d:%02d\n", hours, minutes);

    return 0; // 程序结束
}

埋坑点
一:进位
100/99程序结果会为1,所以需要特判,如果还有余数的话,那就+1;
二:负时间
第一个代码:

if (latestDepartureTime < 0) {
    hours += 24; // 向前一天回绕
}

如果 latestDepartureTime 为负,直接将小时部分 hours 加 24。
这种处理方式不够准确,因为负分钟数没有正确处理,会导致错误的时间计算。
第二个代码:

if (latestDepartureTime < 0) {
    latestDepartureTime += 24 * 60; // 向前一天回绕
}

第二个代码通过将负时间直接加上前一天的总分钟数(1440 分钟),让时间回绕到前一天的正确范围。
这样既能保证负时间的完整转换,也避免了分钟部分计算出错。
我的初始代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int s, v, t, h, m;
    cin >> s >> v;
    t = s / v + 10 + s % v ? 1 : 0;
    t = 480 - t;
    m = t % 60;
    h = t / 60;
    printf("%02d:%02d", h, m);
    return 0;
}

几乎所有坑都踩了


AcWing 656. 钞票和硬币
题目链接:https://www.acwing.com/problem/content/658/
题解代码:

#include <iostream>
#include <vector>
#include <cstdio> // 用于 printf
using namespace std;

int main() {
    double N;
    scanf("%lf", &N); // 使用 scanf 读取浮点数

    // 转换为以分为单位的整数
    int amount = static_cast<int>(N * 100 + 0.5); // 四舍五入避免浮点数精度误差

    // 钞票和硬币面额(以分为单位)
    vector<int> notes = {10000, 5000, 2000, 1000, 500, 200};
    vector<int> coins = {100, 50, 25, 10, 5, 1};

    // 处理钞票
    printf("NOTAS:\n");
    for (int note : notes) {
        int count = amount / note; // 计算当前面额所需数量
        printf("%d nota(s) de R$ %.2f\n", count, note / 100.0);
        amount %= note; // 剩余金额
    }

    // 处理硬币
    printf("MOEDAS:\n");
    for (int coin : coins) {
        int count = amount / coin; // 计算当前面额所需数量
        printf("%d moeda(s) de R$ %.2f\n", count, coin / 100.0);
        amount %= coin; // 剩余金额
    }

    return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main()
{
  double N;
  cin>>N;
  int a[]={100,50,20,10,5,2};
  cout<<"NOTAS:"<<endl;
  for (int i = 0; i < 6; i++) {  
      int num = N / a[i];
      printf("%d nota(s) de R$ %.2lf\n", num, (double)a[i]);  
      N = N - num * a[i]; 
    }
  double b[] = {1, 0.5, 0.25, 0.10, 0.05, 0.01};  
  cout<<"MOEDAS:"<<endl;
  for (int j = 0; j < 6; j++) {  
      int num2=N/b[j]+10e-3;//通过 微小调整 来处理浮点数运算中的误差。
      if (num2 < 0) num2 = 0;  
      printf("%d moeda(s) de R$ %.2lf\n", num2, b[j]);  
      N = N - num2 * b[j];  
    }  
  return 0;
}

double的精度问题

posted @ 2024-12-09 17:35  fufuaifufu  阅读(17)  评论(0编辑  收藏  举报