华为2012上机题

来源:互联网 发布:软件测试定义 编辑:程序博客网 时间:2024/05/22 16:41

输入一个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;}