鱼C论坛

 找回密码
 立即注册
查看: 735|回复: 7

[已解决]写题的输出一个小问题

[复制链接]
发表于 2023-9-24 17:57:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;

int main(){
   
    double a[]={100.00,50.00,20.00,10.00,5.00,2.00};
    int c[]={100,50,20,10,5,2};
    double N;
   
    cin>>N;
    int b;
    b = (int)N;
    printf("NOTAS:\n");
    for(int i=0;i<6;i++){
        printf("%d nota(s) de R$ %.2f\n",b/c[i],a[i]);
        b=fmod(b,a[i]);
        }
   
    double d[]={1.00,0.50,0.25,0.10,0.05,0.01};
    printf("MOEDAS:\n");
    for(int y=0;y<6;y++){
    N=fmod(N,a[y]);
    }
   
   
    for(int j=0;j<6;j++){
        int g=(int)(N/d[j]);
        
        printf("%d moeda(s) de R$ %.2f\n",g,d[j]);
        N=fmod(N,d[j]);
        }
   
    return 0;
}

上面是题目的代码,然后输入一个数字例如463.01,  正确答案中0.01时应该输出数目为1的,但是我这个结果却为0,想知道为什么呢
然后我想问问double类型可以只输出个位数且不四舍五入吗,谢谢
最佳答案
2023-10-10 07:33:35
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. using namespace std;

  5. int main(){
  6.    
  7.     double a[]={100.00,50.00,20.00,10.00,5.00,2.00};
  8.     int c[]={100,50,20,10,5,2};
  9.     double N;
  10.    
  11.     cin>>N;
  12.     int b;
  13.     b = (int)N;
  14.     printf("NOTAS:\n");
  15.     for(int i=0;i<6;i++){
  16.         printf("%d nota(s) de R$ %.2f\n",b/c[i],a[i]);
  17.         b=fmod(b,a[i]);
  18.         }
  19.    
  20.     double d[]={1.00,0.50,0.25,0.10,0.05,0.01};
  21.     printf("MOEDAS:\n");
  22.     for(int y=0;y<6;y++){
  23.     N=fmod(N,a[y]);
  24.     }
  25.    
  26.    
  27.     for(int j=0;j<6;j++){
  28.         int g=(int)(N/d[j] + 0.00001); // 加上一个小的容忍值
  29.         
  30.         printf("%d moeda(s) de R$ %.2f\n",g,d[j]);
  31.         N=fmod(N,d[j]);
  32.         }
  33.    
  34.     return 0;
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-24 17:58:05 | 显示全部楼层
这段代码中,第二个for循环中的代码没有对N进行处理,所以在输出0.01时会出现错误。可以将第二个for循环改为:

  1. for(int j=0;j<6;j++){
  2.     int g=(int)(N/d[j]);
  3.     printf("%d moeda(s) de R$ %.2f\n",g,d[j]);
  4.     N=fmod(N,d[j])*100; // 将N乘以100,保留两位小数
  5. }
复制代码


这样就能正确输出0.01了。

至于double类型只输出个位数且不四舍五入,可以使用printf函数的格式控制符"%.0f"来实现,例如:

  1. double x = 3.14159;
  2. printf("%.0f", x); // 输出3
复制代码


这样就只会输出整数部分,不会四舍五入。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-24 17:58:21 | 显示全部楼层
> 问题1:为什么在输入463.01时输出为0而不是1?

在你的代码中,你使用了 fmod 函数来计算余数,但这个函数并不适用于浮点数运算。因此,当你计算 N=fmod(N,a[y]) 时,并不能得到正确的结果,导致 N 的值没有被更新正确。

为了解决这个问题,你可以将 N 的类型改为 int,并在进行除法运算之前将其乘以100。这样可以将小数部分转换为整数,然后使用整数进行计算。

以下是修改后的代码示例:
  1. ++
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include <math.h>
  5. using namespace std;
  6. int main(){
  7.    
  8.     double a[]={100.00,50.00,20.00,10.00,5.00,2.00};
  9.     int c[]={100,50,20,10,5,2};
  10.     double N;
  11.    
  12.     cin>>N;
  13.     int b;
  14.     b = (int)(N * 100);  // 将 N 转换为整数,并乘以100
  15.     printf("NOTAS:\n");
  16.     for(int i=0;i<6;i++){
  17.         printf("%d nota(s) de R$ %.2f\n",b/c[i],a[i]);
  18.         b=b%c[i]; // 更新 b 的值为余数
  19.     }
  20.    
  21.     double d[]={1.00,0.50,0.25,0.10,0.05,0.01};
  22.     printf("MOEDAS:\n");
  23.     for(int y=0;y<6;y++){
  24.         N=b;  // 使用 b 的值进行计算
  25.         b=(int)(fmod(N*100,a[y]*100)); // 将结果转换为整数,并重新赋值给 b
  26.     }
  27.    
  28.    
  29.     for(int j=0;j<6;j++){
  30.         int g=(int)(N/d[j]);
  31.         
  32.         printf("%d moeda(s) de R$ %.2f\n",g,d[j]);
  33.         N=fmod(N,d[j]);
  34.     }
  35.    
  36.     return 0;
  37. }
复制代码

通过将 N 转换为整数并乘以100,我们可以保留小数点后两位的精度。然后,在计算余数时,将乘以100后的结果转换回浮点数。

> 问题2:double 类型可以只输出个位数且不四舍五入吗?

默认情况下,printf 函数会根据浮点数的类型进行四舍五入并输出指定精度的结果。如果你想要只输出个位数且不进行四舍五入,你可以使用 floor 函数将浮点数向下取整,然后结合 printf 进行格式化输出。

以下是一个示例,展示如何在保留一位小数的情况下,只输出个位数并不进行四舍五入:
  1. ++
  2. #include <stdio.h>
  3. #include <math.h>
  4. int main() {
  5.     double num = 3.9;
  6.     double rounded = floor(num * 10) / 10;  // 取整到小数点后一位
  7.    
  8.     printf("%.1f\n", rounded);  // 输出结果,保留一位小数
  9.    
  10.     return 0;
  11. }
复制代码

在上述示例中,我们将浮点数 num 乘以10,再使用 floor 函数向下取整,并除以10,得到只保留一位小数的结果。然后,我们使用 printf%.1f 格式化指令来输出结果,保留一位小数。

希望这些解答对你有帮助,如果你还有任何疑问,请随时提问!

球一个最佳答案谢谢啦!这对我非常重要!
回答可能有误,多多谅解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-24 17:58:24 | 显示全部楼层
在给定的代码中,对于计算硬币数量部分存在一些问题。下面是对代码进行修正的版本:

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. using namespace std;

  5. int main() {
  6.   double a[] = {100.00, 50.00, 20.00, 10.00, 5.00, 2.00};
  7.   int c[] = {100, 50, 20, 10, 5, 2};
  8.   double N;
  9.   cin >> N;
  10.   int b;
  11.   b = (int)N;
  12.   printf("NOTAS:\n");
  13.   for (int i = 0; i < 6; i++) {
  14.     printf("%d nota(s) de R$ %.2f\n", b / c[ i], a[ i]);
  15.     b = b % c[ i];
  16.   }
  17.   
  18.   double d[] = {1.00, 0.50, 0.25, 0.10, 0.05, 0.01};
  19.   printf("MOEDAS:\n");
  20.   for (int j = 0; j < 6; j++) {
  21.     int g = (int)(N / d[j]);  // 修改此处计算硬币数量
  22.     printf("%d moeda(s) de R$ %.2f\n", g, d[j]);
  23.     N = fmod(N, d[j]);
  24.   }
  25.   return 0;
  26. }
复制代码


上述修正后的代码会正确计算并输出硬币的数量。

关于你的第二个问题,double 类型默认情况下会进行四舍五入。如果你想截断小数部分且不进行四舍五入,可以使用floor()函数。floor()函数会返回不大于输入值的最大整数。

例如,假设你要输出个位数,则可以将代码中硬币数量输出部分修改如下:

  1. for (int j = 0; j < 6; j++) {
  2.   int g = (int)floor(N / d[j]);  // 使用 floor() 截断小数部分
  3.   printf("%d moeda(s) de R$ %.2f\n", g, d[j]);
  4.   N = fmod(N, d[j]);
  5. }
复制代码


这样就可以输出截断后的硬币数量。

希望这些解释能够解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-24 18:12:30 | 显示全部楼层
Mike_python小 发表于 2023-9-24 17:58
> 问题1:为什么在输入463.01时输出为0而不是1?

在你的代码中,你使用了 fmod 函数来计算余数,但这个函 ...

大佬,我用你这个代码输出,然后除了第一个下面全是0欸
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-24 18:14:40 | 显示全部楼层
陶远航 发表于 2023-9-24 17:58
在给定的代码中,对于计算硬币数量部分存在一些问题。下面是对代码进行修正的版本:

大佬,但是这样输出的话,硬币的N就不对了呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-24 18:17:46 | 显示全部楼层
isdkz 发表于 2023-9-24 17:58
这段代码中,第二个for循环中的代码没有对N进行处理,所以在输出0.01时会出现错误。可以将第二个for循环改 ...

输出的不对呀,都是乘100的,然后四舍五入也不对,输入3.5还是被五入了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-10 07:33:35 | 显示全部楼层    本楼为最佳答案   
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. using namespace std;

  5. int main(){
  6.    
  7.     double a[]={100.00,50.00,20.00,10.00,5.00,2.00};
  8.     int c[]={100,50,20,10,5,2};
  9.     double N;
  10.    
  11.     cin>>N;
  12.     int b;
  13.     b = (int)N;
  14.     printf("NOTAS:\n");
  15.     for(int i=0;i<6;i++){
  16.         printf("%d nota(s) de R$ %.2f\n",b/c[i],a[i]);
  17.         b=fmod(b,a[i]);
  18.         }
  19.    
  20.     double d[]={1.00,0.50,0.25,0.10,0.05,0.01};
  21.     printf("MOEDAS:\n");
  22.     for(int y=0;y<6;y++){
  23.     N=fmod(N,a[y]);
  24.     }
  25.    
  26.    
  27.     for(int j=0;j<6;j++){
  28.         int g=(int)(N/d[j] + 0.00001); // 加上一个小的容忍值
  29.         
  30.         printf("%d moeda(s) de R$ %.2f\n",g,d[j]);
  31.         N=fmod(N,d[j]);
  32.         }
  33.    
  34.     return 0;
  35. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表