华为2012上机题

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值