第1题:数的分解

第1题:数的分解

这是一道数学题,有一定的难度,但是结合数学思考就可以迎刃而解了。
具体方法:
先做一个例子:比如四为数abcd(当然上面有一条横线)
它等于

1000a+100b+10c+d

去掉个位则是

100a+10b+c

继续去做是

10a+b

继续去做是

a

我们把它们加在一起是

1111a+111b+11c+1d

这么多个1,显然是突破口,那么我们就可以用除法先去做,举个例子样例564

564÷111=5564div111=5

564mod111=9564mod 111=9

9÷11=09div11=0

9mod11=99mod11=9

9÷1=99div1=9

我们将每次找到的数拼起来就变成了原来的数 509509

是不是很神奇

那么问题来了:从几个1开始入手呢? 其实很简单我们可以从16个1开始入手,因为除得0,加一个前缀0,放在int里,会自动删除呀

所以,我们的代码来了

#include <bits/stdc++.h>
using namespace std;
long long a[17]={0,1,11,111,1111,11111,111111,1111111,11111111,111111111,1111111111,11111111111,111111111111,1111111111111,11111111111111,111111111111111};
int main(){
	long long x,ans=0;
	cin>>x;
	for(int i=16;i>=1;i--){
		if(x/a[i]>=10){
			cout<<-1;
			return 0;
		}ans=ans*10+x/a[i];
		x%=a[i];
	}cout<<ans;
	return 0;
}

我打了一个表,当然大家也可以递推做这个表,或不用数组

#include <bits/stdc++.h>
using namespace std;
int main(){
	for(int i=1;i<=n;i++)a[i]=a[i-1]*10+1;
	return 0;
}

不过注意 101610^{16} 要开 longlong

原文地址:https://www.cnblogs.com/zhaohaikun/p/12816997.html