问题:编写一个程序,输入一个整数,输出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。但是这样改动后得到的结果没有任何变化。

----------------------------------------分界线------------------------------------------------------

*后来我又遇到了一个类似的问题,不知道与之前这个问题是否同理。问题源自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!

记录0~9各数字出现的次数相关推荐

  1. Java黑皮书课后题第7章:**7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数。假定输入0表示结束

    7.3(计算数字的出现次数)编写程序,读取1到100之间的整数,然后计算每个数出现的次数 题目 题目描述+运行示例 破题 法一 法二 代码 法一:硬生生解出来 法二完整代码 题目 题目描述+运行示例 ...

  2. 统计数组中每个数字出现的次数_剑指Offer(二十八) 数组中次数出现超过一半的数字...

    题目描述 思路与解析 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长 ...

  3. 数字统计之统计页码数字出现的次数

    给定一个十进制整数N,求出从1到N的所有整数中出现"1"的个数. 例如:N=2,1,2出现了1个"1". N=12,1,2,3,4,5,6,7,8,9,10,1 ...

  4. 统计每个数字出现的次数。

    题目描述:一个数组大小N,由0到N-1之间的数组组成,或重复,或不存在,请统计每个数字出现的次数. #include<iostream> using namespace std; //借用 ...

  5. 剑指Offer 56 数组中数字出现的次数

    数组中数字出现的次数 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 1 # -*- coding:utf-8 -*- 2 class Solution: ...

  6. 数组中有一个数字出现的次数超过数组长度的一半

    题目: 数组中有一个数字出现的次数超过数组长度的一半.请找出这个数字. 解答: 1 public class Solution { 2 3 public int MoreThanHalfNum_Sol ...

  7. 面试题56: 数组中数字出现的次数

    /******************************************************************* *<剑指Offer--名企面试官精讲典型编程题>C ...

  8. 判断一个字符串大写小写,和数字出现的次数

    /*** 判断一个字符串大写小写,和数字出现的次数*/ public class Demo4 {public static void main(String[] args) {String str = ...

  9. mysql dp.cal 显示汉子_计算1到N中各个数字出现的次数 --数位DP

    题意:给定一个数n,问从1到n中,0~9这10个数字分别出现了多少次.比如366这个数,3出现了1次,6出现了2次. 题解:<剑指offer>P174:<编程之美>P132 都 ...

最新文章

  1. python排序函数set_【Python】排列组合itertools 集合set
  2. boost的chrono模块等待按键的测试程序
  3. 【原理图操作】原理图更新PCB时未改动元器件布局变动问题?
  4. 阅读react-redux源码 - 零
  5. 重构,改善既有代码的设计--第八章感悟
  6. python画图怎么调色_Python气象数据处理与绘图(19):如何使用NCL色板(调色盘思路相同)...
  7. 济南市建筑物矢量数据(Shp格式+带高度)
  8. CME上位机控制Copley驱动MAXON电机
  9. 通用pe工具箱能安装linux吗,通用pe工具箱怎么装系统图文步骤
  10. 申论该怎么学?申论作文如何提高
  11. html表单变灰,excel菜单灰色 excel工具栏突然变灰了 怎么办
  12. 冒泡排序c语言子程序,C语言之冒泡排序算法
  13. Java中的Timer 怎么暂停,如何暂停Java.uti.Timer?
  14. Working With JSON
  15. 苏雅欣课后作业四 个人总结
  16. WeUI - 微信官方推出的免费开源 UI 组件库,上手简单,风格简约,在微信生态开发轻量项目的绝佳选择
  17. XUPT 寒假算法集训第三周
  18. 打开chm文件的其他方式
  19. 在Altium Designer中快速命名多引脚芯片的引脚名称
  20. 应广单片机adc_台湾应广单片机 单片机PMC131 带12位ADC、采用FPPATM技术

热门文章

  1. 通过ThreadPoolExecutor与ForkJoinPool比较,分别对比其execute ,submit 等方法提交线程池任务的区别,来深入理解线程池及并发编程
  2. @keyframes书写顺序
  3. 【QT】QApplication简介
  4. 云从科技助力智慧出行:登机安检更加“智能” | 百万人学AI评选
  5. 程序员业余时间赚钱的途径
  6. java.lang.ClassNotFoundException: org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver
  7. app android安装测试,【和小强学移动app测试1】android移动开发环境搭建与配置
  8. Ubuntu Linux操作系统tftp服务器和客户端安装(简单操作)
  9. 电子计算机印前技术定义,印前作业:你了解数码印前技术么?
  10. 分页总数计算,根据总记录数获取分页总数_ZZGoals