从一道趣味数学题引发的数论

原题:

用0~9这十个数字组成是11的倍数的最大十位数是多少。

 

求解过程:

第一反应是数位dp,接着想偷懒,暴力求解。

#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;


int check(ll x)
{
//函数用来判断是否由0-9组成 
	int a[10]= {0,};
	while(x)
	{
		a[x%10]++;
		x/=10;
	}
	sort(a,a+10);
	if(a[0]!=1||a[9]!=1)return 1;
	else return 0;
}

int main()
{
	ll x=9876543210/11;//X最大的可能取值
	int flag=1;
	while(flag)
	{
		x--;
		flag=check(x*11);
	}
	cout<<x*11<<endl;
	return 0;
}

可以得出结果:

然后老师说,这是一道数论题目。

原理:B进制的数是B+1倍数,则奇数位数字和减去偶数位数字和为B+1的倍数

举两个例子:

我有一个四位数的十进制:

我先在第一位和第三位放两个9:

接下来,如果我需要这个四位数是11的倍数,那么:令(9+9)- 偶数位和=11,则偶数位和我可以取7,那么,取一个5,一个2

用计数器验证一下:9592 ➗ 11 刚好等于872~

第二个例子:二进制的101010

二进制的101010=32+8+2=42.

而42 ➗ 3 刚好等于14~

 

 

所以回到我们最开始的那道题目。

由0-9组成的十位数,所以位数和为0+1+2+......+8+9=45.

设奇数位和为X,偶数位和为Y。

则X+Y=45. --------------------------------------------------------------------①

若要让这个数为11的倍数,则X-Y=0,11,22,33,44 ----------②

由X+Y=45是奇数,所以X和Y一奇数一偶数,所以X-Y也应该是奇数

则X-Y=11,33-----------------------------------------------------------------③

结合①③,易得X=28,Y=17.

接下来可以填数了。

因为要求的是最大值,所以我们把98765填在前5位,0填在最后一位。

然后根据28填充剩下的奇数位:

根据17填充剩下来的偶数位:

比较一下:

完美~

Over。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值