一、设计思路
在课堂上讨论的时候,老师提出的思路是利用之前的结果计算出比它更大的数字的“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 }
三、结果截图
四、心得体会
敲代码的时候,我以为会挺好写的,想用递归的思想来实现,但是没能自己将每位上的情况总结出来。于是借鉴了一下网上的思路,有个程序是一次性看三位,当前位、高一位和低一位。代码简洁完美。
我发现每次写这种注重算法的程序时,自己就捉襟见肘了,还是得多练,提高一下自己优化代码的能力。