黑马程序员技术交流社区

标题: 关于取余数的奇怪问题 [打印本页]

作者: 黑马IT男    时间: 2014-3-24 20:13
标题: 关于取余数的奇怪问题
本帖最后由 黑马IT男 于 2014-3-26 13:25 编辑

要从键盘输入两个数,打印(printf)这两个数的和、差、积、商、以及余数。
我像这样写的
#include <stdio.h>
int main()
{
        printf("请输入两个数a和b:\n");
        
        double a,b;
        
        scanf("%lf %lf",&a,&b);
        
        printf("两个数的和是=%lf\n",a+b);
        printf("两个数的差是=%lf\n",a-b);
        printf("两个数的积是=%lf\n",a*b);
        printf("两个数的商是=%lf\n",a/b);
        printf("两个数的余数是=%d\n",(int)a%(int)b);
        
        return 0;
}
程序执行没有问题,但当我这样写的时候
#include <stdio.h>
int main()
{
        printf("请输入两个数a和b:\n");
        
        double a,b;
        
        scanf("%lf %lf",&a,&b);
        
   /**  printf("两个数的和是=%lf\n",a+b);
        printf("两个数的差是=%lf\n",a-b);
        printf("两个数的积是=%lf\n",a*b);
        printf("两个数的商是=%lf\n",a/b);
        printf("两个数的余数是=%d\n",(int)a%(int)b);
   */        
        printf("%lf + %lf的和是=%lf\n",a,b,a+b);        
        printf("%lf - %lf的差是=%lf\n",a,b,a-b);
        printf("%lf * %lf的积是=%lf\n",a,b,a*b);
        printf("%lf / %lf的商是=%lf\n",a,b,a/b);
        printf("%d % %d的余数是=%d\n",(int)a,(int)b,(int)a % (int)b);
               
        return 0;
}


执行的结果取余数并不是自己想要的,大神求解。比如我输入13,1结果显示是
请输入两个数a和b:
13 12
13.000000 + 12.000000的和是=25.000000
13.000000 - 12.000000的差是=1.000000
13.000000 * 12.000000的积是=156.000000
13.000000 / 12.000000的商是=1.083333
13 %d的余数是=12

作者: luoyilan222    时间: 2014-3-24 20:59
本帖最后由 luoyilan222 于 2014-3-24 21:01 编辑

printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);   当 int/double  会进行自动转换 最后就会变成double/double  所以结果当然就不对呀,就如你没有转换一样  你可以这样测试下  printf("%d % %d的商是=%d\n",(int)a,(int)b,a/b);  你看结果是否和上面一样就知道咯
作者: agelessman    时间: 2014-3-24 21:00
printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);改成
printf("%d %% %d的商是=%d\n",(int)a,(int)b,(int)a/b);
作者: 远人    时间: 2014-3-24 21:13
复制了你的代码初略检查了
错误全在这条代码
  1. printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);
复制代码

第一个错误:不能单独输出 % ,在c语言中 % 号有特殊含义,这是检验函数
  1. #include <stdio.h>
  2. int main()
  3. {
  4.     printf("%");
  5.     return 0;
  6. }
复制代码


第二个错误:你这里要求的是余数,你的最后给出的代码是(int)a/b,这明显求的是商。
第三个错误:模运算符,也就是取余运算符只能运用在整数之间,你这里是在a 和 b的doulb类小数之间取余,明显错误,应该修改为(int)a%(int)b.
作者: FlyTrem    时间: 2014-3-24 21:14
printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);
,(int)a/b主要是这个,将a变成了整型,那么b呢?还是double型的,int与double相除会自动提升为double的,而要输出整型当然是不对的!可以这样试试,(int)a/(int)b.
作者: 黑马IT男    时间: 2014-3-24 21:15
luoyilan222 发表于 2014-3-24 20:59
printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);   当 int/double  会进行自动转换 最后就会变成dou ...

谢谢,不过还是不行的
作者: 黑马IT男    时间: 2014-3-24 21:17
FlyTrem 发表于 2014-3-24 21:14
printf("%d % %d的商是=%d\n",(int)a,(int)b,(int)a/b);
,(int)a/b主要是这个,将a变成了整型,那么b呢? ...

刚才传代码的时候弄错了,现在改过来了,还是不行




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2