永远Forever 发表于 2023-9-24 17:57:54

写题的输出一个小问题

#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,a);
      b=fmod(b,a);
      }
   
    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);
    }
   
   
    for(int j=0;j<6;j++){
      int g=(int)(N/d);
      
      printf("%d moeda(s) de R$ %.2f\n",g,d);
      N=fmod(N,d);
      }
   
    return 0;
}

上面是题目的代码,然后输入一个数字例如463.01,正确答案中0.01时应该输出数目为1的,但是我这个结果却为0,想知道为什么呢
然后我想问问double类型可以只输出个位数且不四舍五入吗,谢谢

isdkz 发表于 2023-9-24 17:58:05

这段代码中,第二个for循环中的代码没有对N进行处理,所以在输出0.01时会出现错误。可以将第二个for循环改为:

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


这样就能正确输出0.01了。

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

double x = 3.14159;
printf("%.0f", x); // 输出3


这样就只会输出整数部分,不会四舍五入。

Mike_python小 发表于 2023-9-24 17:58:21

> 问题1:为什么在输入463.01时输出为0而不是1?

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

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

以下是修改后的代码示例:

++
#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 * 100);// 将 N 转换为整数,并乘以100
    printf("NOTAS:\n");
    for(int i=0;i<6;i++){
      printf("%d nota(s) de R$ %.2f\n",b/c,a);
      b=b%c; // 更新 b 的值为余数
    }
   
    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=b;// 使用 b 的值进行计算
      b=(int)(fmod(N*100,a*100)); // 将结果转换为整数,并重新赋值给 b
    }
   
   
    for(int j=0;j<6;j++){
      int g=(int)(N/d);
      
      printf("%d moeda(s) de R$ %.2f\n",g,d);
      N=fmod(N,d);
    }
   
    return 0;
}


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

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

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

以下是一个示例,展示如何在保留一位小数的情况下,只输出个位数并不进行四舍五入:

++
#include <stdio.h>
#include <math.h>

int main() {
    double num = 3.9;
    double rounded = floor(num * 10) / 10;// 取整到小数点后一位
   
    printf("%.1f\n", rounded);// 输出结果,保留一位小数
   
    return 0;
}


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

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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
回答可能有误,多多谅解!

陶远航 发表于 2023-9-24 17:58:24

在给定的代码中,对于计算硬币数量部分存在一些问题。下面是对代码进行修正的版本:

#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 = b % c[ i];
}

double d[] = {1.00, 0.50, 0.25, 0.10, 0.05, 0.01};
printf("MOEDAS:\n");
for (int j = 0; j < 6; j++) {
    int g = (int)(N / d);// 修改此处计算硬币数量
    printf("%d moeda(s) de R$ %.2f\n", g, d);
    N = fmod(N, d);
}
return 0;
}


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

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

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

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


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

希望这些解释能够解决你的问题!如果还有其他疑问,请随时提问。
如果问题已经解决,请设置最佳答案

永远Forever 发表于 2023-9-24 18:12:30

Mike_python小 发表于 2023-9-24 17:58
> 问题1:为什么在输入463.01时输出为0而不是1?

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

大佬,我用你这个代码输出,然后除了第一个下面全是0欸{:5_99:}

永远Forever 发表于 2023-9-24 18:14:40

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




大佬,但是这样输出的话,硬币的N就不对了呀

永远Forever 发表于 2023-9-24 18:17:46

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

输出的不对呀,都是乘100的,然后四舍五入也不对,输入3.5还是被五入了

小甲鱼 发表于 2023-10-10 07:33:35

#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,a);
      b=fmod(b,a);
      }
   
    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);
    }
   
   
    for(int j=0;j<6;j++){
      int g=(int)(N/d + 0.00001); // 加上一个小的容忍值
      
      printf("%d moeda(s) de R$ %.2f\n",g,d);
      N=fmod(N,d);
      }
   
    return 0;
}
页: [1]
查看完整版本: 写题的输出一个小问题