记录0~9各数字出现的次数

问题:编写一个程序,输入一个整数,输出0~9各个数字在该整数中出现的次数。(《C语言程序设计》夏宽理u3t1)
我一开始写的代码:

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

int main()
{   int x,index;
    int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,n=1;
    printf("请输入一个整数:\n");
    scanf("%d",&x);
    while(pow(10,n)<x) n++;  //x是n位数
    for(index=1;index<=n;index++)
    **switch(x%(pow(10,index))/(pow(10,index-1)))**//报错!
    {
        case 0:a++;break;
        case 1:b++;break;
        case 2:c++;break;
        case 3:d++;break;
        case 4:e++;break;
        case 5:f++;break;
        case 6:g++;break;
        case 7:h++;break;
        case 8:i++;break;
        case 9:j++;break;
    }
    printf("0:%d  1:%d  2:%d  3:%d  4:%d  5:%d  6:%d  7:%d  8:%d  9:%d",a,b,c,d,e,f,g,h,i,j);
    return 0;
}

加粗的这行有报错,它是这样说的:大意:
“%”的操作数出现了问题。难道是pow(10,index)不是整型吗?
于是我做了如下改变:
原来:switch(x%(pow(10,index))/(pow(10,index-1)))
后来:switch(x%(int)(pow(10,index))/(int)(pow(10,index-1)))
果然就没有报错了!百度了一下,发现pow函数的两个参数和函数值都是double型!

但是测验了一下,发现比较小的数字都能得到正确结果
在这里插入图片描述
在这里插入图片描述
但是如果数字比较长,就会出错
在这里插入图片描述
在这里插入图片描述
或许是int对数字大小的要求导致不能正确算出比较大的数吧?但是奇怪的是12345在int的取值范围内,为什么也会出错呢?

后来我修改了一下,因为不知道具体是哪里超了范围(假如出错的原因是超范围的话),就改动了很多地方,如下图所示。把三处int改成了long,把一个%d改成了%ld。但是这样改动后得到的结果没有任何变化。
int→long
----------------------------------------分界线------------------------------------------------------

*后来我又遇到了一个类似的问题,不知道与之前这个问题是否同理。问题源自u3t6。
以下这个代码试图提取整数x的倒数第i位。当我取x为2345,i为2时结果为6:

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

int main()
{   int x=2345;int i=2;
    printf("%d",(x%(int)pow(10,i))/(int)pow(10,i-1));
    return 0;
}

在这里插入图片描述
当我不采用x这个变量,并且把2345直接代到算式中时,答案仍为6

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

int main()
{   int i=2;
    printf("%d",(2345%(int)pow(10,i))/(int)pow(10,i-1));
    return 0;
}

在这里插入图片描述
现在复原x,而不采用i这个变量,把2直接代入式子,答案就变成了正确答案4!

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

int main()
{   int x=2345;
    printf("%d",(x%(int)pow(10,2))/(int)pow(10,1));
    return 0;
}

在这里插入图片描述
如果我两个都不采用,像下面这样,答案也是正确的。

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

int main()
{
    printf("%d",(2345%(int)pow(10,2))/(int)pow(10,1));
    return 0;
}

这说明发生问题的原因在与pow后面的第二个参数。前面说pow函数的参数必须是double类型,因此把int放在这里确实不妥。可是当我把i定义为一个double类型的数时,结果仍然是6。

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

int main()
{
    double i=2;
    printf("%d",(2345%(int)pow(10,i))/(int)pow(10,i-1));
    return 0;
}

这是为什么呢?


已解决:这是因为<math.h>里的pow函数结果值有时会不太精确,可能会用近似的值表示,如100表示成99.99999等。再强行取整的话,就变成了99!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值