随堂作业——到底有几个“1”(C++)

一、设计思路

  在课堂上讨论的时候,老师提出的思路是利用之前的结果计算出比它更大的数字的“1”。但是我不是这么想的,我是把输入的正整数每位上的数都分解出来计算。如abc,就先算c,再加上b,最后再加上a。

二、源代码

 1 // one.cpp : Defines the entry point for the console application.
 2 //
 3 
 4 #include "stdafx.h"
 5 #include "iostream.h"
 6 
 7 int FindOnes(int num)
 8 {
 9     int ones,mul,num1,num2,num3;
10     ones=0;
11     mul=1;                //除数,10的n次方
12     num1=num2=num3=0;
13     while(num/mul)        //当取整后不为零的话,就循环计算
14     {
15         num1=num-(num/mul)*mul;        //后一位上的数字
16         num2=(num/mul)%10;            //当前位数上的数字
17         num3=num/(mul*10);            //前一位上的数字
18         switch(num2)                //若正整数为abc,b为当前位数
19         {
20             case 0:                    //余数为0时,包含a*mul个1;
21                 ones+=num3*mul;
22                 break;
23             case 1:                    //余数为1时,包含a*mul+c+1;
24                 ones+=num3*mul+num1+1;
25                 break;
26             default:                //其余>1的情况都是(a+1)*mul
27                 ones+=(num3+1)*mul;
28                 break;
29         }
30         mul*= 10;                    //改变除数,继续计算更高位
31     }
32     return ones;
33 }
34 int main(int argc, char* argv[])
35 {
36     int number,ones;    //数字、1的个数
37     cout<<"请输入一个正整数:";
38     cin>>number;
39     ones=FindOnes(number);
40     cout<<number<<"中“1”的个数为"<<ones<<endl;
41     return 0;
42 }

 

三、结果截图

四、心得体会

  敲代码的时候,我以为会挺好写的,想用递归的思想来实现,但是没能自己将每位上的情况总结出来。于是借鉴了一下网上的思路,有个程序是一次性看三位,当前位、高一位和低一位。代码简洁完美。

  我发现每次写这种注重算法的程序时,自己就捉襟见肘了,还是得多练,提高一下自己优化代码的能力。

posted @ 2015-05-01 21:45  JJJanepp  阅读(316)  评论(0编辑  收藏  举报