如果百位上数字大于1(即为2~9),则百位上可能出现1的次数也仅由更高位决定,比如12 213,则百位出现1的可能性为:100~199,1 100~1 199,2 100~2 199,…,11 100~11 199,12 100~12 199,一共有1 300个,并且等于更高位数字1(121)×当前位数(100)。
通过上面的归纳和总结,我们可以写出如下的更高效算法来计算f(N):
代码清单2-10
int count=0;//需注意越界
int number=1;//操作数
int lower=0;//个位1个数
int mid=0;//十位1个数
int high=0;//百位1个数
int n=123;

while(n/number!=0)
{
lower=n-(n/number)*number;
mid=(n/number)%10;
high=n/(number*10);
System.out.println(lower" mid= "mid" high "high);
switch(mid)
{
case 0:
count=high*number;
break;
case 1:
count=high*numberlower1;
break;
default:
count=(high1)*number;
break;
}
number=number*10;
}
System.out.println(count);
}
2
f(n)=n;
编程之美上得大数存储比较麻烦
至于10的11次方很大数,超出long long 范围,所以需要大数存储,利用字符串解决
该方法需要读者自己解析
现在只验证一下编程之美上给出的结果(c)
1111111110
#include <iostream>
using namespace std;
int main()

{
long long int low;//注意越界问题
long long int mid;
long long int high;
long long int number = 1;
long long int n=1111111110;
long long int count = 0;//1的计数
while(n/number!=0)
{
low=n-(n/number)*number;
mid=(n/number)%10;
high=n/(number*10);
switch(mid)
{
case 0:
count=high*number;
break;
case 1:
count=high*numberlow1;
break;
default:
count=(high1)*number;
break;
}
number*=10;
}
if(count==n)
{
cout<<count<<endl;
}
return 0;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-31384-2.html
美军刚出发就有中军舰尾随