输入一个int N ,统计1-N中含有7或能被7整除的数的个数
思路: 能被7整除的数很好求 N/7 个 。 再求1-N中含有7的数字个数。最后要减去重叠部分
检测含有7的个数的代码如下:
#include <iostream>
#include <cmath>
#include <ctime>
#include <cassert>
using namespace std;
clock_t start,finish;
int factor[11]; //保存 0,1,10,100,1000......尽量减少程序中乘除法模运算的次数。
int temp[11]; //保存中间结果,0,1,9*1 + 10,9*19 + 10......便于计算
int sum = 0;
int search7(int num,int n)
{
assert(num > 0);
if (n == 1)
{
if (num < 7)
{
return 0;
}else{
return 1;
}
}
if (num/factor[n] == 7)
{
return search7(num%factor[n],n - 1) + 6*temp[n-1];
}else if (num/factor[n] < 7)
{
return search7(num%factor[n],n - 1) + (num/factor[n])*temp[n-1];
}else{
return search7(num%factor[n],n - 1) + (num/factor[n] - 1)*temp[n-1] + factor[n];
}
}
int main()
{
double time;
int a;
factor[0] = temp[0] = 0;
factor[1] = temp[1] = 1;
start = clock();
for (int i = 2; i < 11; i++)
{
factor[i] = (double)pow((double)10,i-1);
temp[i] = 9*temp[i-1] + factor[i];
//cout<<temp[i]<<" ";
}
cout<<search7(2008080808,10)<<endl;
finish = clock();
time = (double)(finish - start)/CLOCKS_PER_SEC;
printf("%f s",time);
return 0;
}

6820

被折叠的 条评论
为什么被折叠?



