1037

本文通过一个具体的程序实例介绍了如何解决汉密尔顿回路问题,并使用了特定条件下的数学公式来计算结果。作者最初误以为这是一个简单的乘法问题,但后来意识到其背后的复杂性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <math.h>
int main()
{
    int m,n,k,i;
float s;
scanf("%d",&k);
for(i=1;i<=k;i++)
    {scanf("%d %d",&m,&n);
if(m%2==0||n%2==0)
s=m*n;
    else s=m*n-1+sqrt(2);
printf("Scenario #%d:\n",i);
        printf("%.2f\n",s);
printf("\n");}

    return 0;

}

我从来都是不看题目的,直接看示例,还以为是简单的乘法。。。后来知道是汉密尔顿回路问题,还是说是货郎担问题?我的妈啊,还要考数学推论的问题!!!直接给公式不行吗???完全没有头绪,只好百度找到公式写代码了。。。呃,,其实多画几个图也是可以推出公式的哈

### C++ PAT 乙级 1037 题目解析 #### 霍格沃茨货币体系简介 霍格沃茨的货币单位有三种:加隆(Galleon),西可(Sickle),纳特(Knut)。其中,1 加隆等于 17 西可,而 1 西可又等于 29 纳特。 #### 输入处理 程序需接收两个金额数值作为输入,分别为购买价格 \(P\) 和支付金额 \(A\) 。两者均采用 `Galleon.Sickle.Knut` 的形式表示[^5]。 #### 计算找零逻辑 为了实现精确找零功能,需要先将给定的价格转换成最小单位——纳特,再执行减法运算得出应找回的钱数。具体步骤如下: - 将 \(P\) 和 \(A\) 中各部分按照其对应价值折合成总纳特数量; - 执行差额计算得到最终要返回给顾客的实际数额; - 把上述结果反向拆分为对应的加隆、西可以及剩余纳特数目并输出。 ```cpp #include <iostream> using namespace std; struct Money { long g, s, k; }; Money toKnut(Money m){ return {(m.g * 17 + m.s) * 29 + m.k, 0, 0}; } void fromKnut(long knut, Money& res){ res.g = knut / (17*29); knut %= 17*29; res.s = knut / 29; res.k = knut % 29; } int main(){ char ch; Money p={0}, a={0}, change={0}; // Read input values and convert them into Knuts. scanf("%ld.%ld.%ld %c %ld.%ld.%ld", &p.g,&p.s,&p.k,&ch,&a.g,&a.s,&a.k); auto pk = toKnut(p), ak = toKnut(a); if(pk.k > ak.k){puts("-1");return 0;} long diff = ak.k - pk.k; fromKnut(diff,change); printf("%ld.%ld.%ld\n", change.g, change.s, change.k); } ``` 此代码片段实现了从读取用户输入到完成找零过程的功能,并考虑到了当支付金额不足以覆盖商品成本时的情况(即直接输出 `-1`)。此外还包含了必要的结构体定义用于存储不同面值的数量及其相互之间的转换函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值