Simple Addition

本文介绍了如何通过自定义函数计算一个数字各数位之和,并利用该函数解决特定区间内满足条件的数字数量计算问题。通过深度优先搜索(DFS)算法,快速找到满足条件的数字并进行计数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://acm.hust.edu.cn/vjudge/contest/view.action?cid=31329#problem/V

使用题目所给函数,单单从某一个数字来看,就是直接求这个数各个数位上的和;而且p=====>q之间的数调用这个函数,其数值都是在1~9之间;因此,求x和y%10的值,然后就直接45*((y-x)/10 );45是1+2+。。。+9的和,后面代表,p和q之间拥有多少个满足条件的组数,然后直接使用DFS递推即可

#include<map>
#include<set>
#include<list>
#include<cmath>
#include<ctime>
#include<deque>
#include<stack>
#include<bitset>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include<numeric>
#include<sstream>
#include<utility>
#include<iostream>
#include<algorithm>
#include<functional>

using namespace std ;
long long ans , p , q ; 
long long f( long long n )
{
	if( n == 0 )
		return 0 ;
	else if( n % 10 )
	{
		return n % 10 ;
	}
	else
	{
		return f( n / 10 ) ;
	}
}

void DFS( long long x , long long y )
{
	long long i , j ; 
	if( y - x < 10 )
	{
		for( int i  = x ; i <= y ; ++i )
		{
			ans += f( i ) ;
		}
		return ;
	}
	for( i = x ; i % 10 != 0 ; ++i )
	{
		ans += f( i ) ;
	}
	for( j = y ; j % 10 != 0 ; --j )
	{
		ans += f( j ) ;
	}
	ans += 45 * ( ( j - i  ) / 10 );
	DFS( i / 10 , j / 10 ) ;
}
int main()
{

	while( scanf( "%lld%lld" , &p , &q ) != EOF )
	{
		if( p == -1 && q == -1 )
			break ;
		ans  = 0 ; 
		DFS( p , q ) ;
		printf( "%lld\n" , ans ) ;
	}
	return 0 ;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值