第1题:数的分解
kradcigam
2019-07-21 14:01:02
# 第1题:数的分解
## 这是一道数学题,有一定的难度,但是结合数学思考就可以迎刃而解了。
## 具体方法:
#### 先做一个例子:比如四为数abcd(当然上面有一条横线)
#### 它等于
```cpp
1000a+100b+10c+d
```
#### 去掉个位则是
```cpp
100a+10b+c
```
#### 继续去做是
```cpp
10a+b
```
#### 继续去做是
```cpp
a
```
我们把它们加在一起是
```cpp
1111a+111b+11c+d
```
这么多个1,显然是突破口,那么我们就可以用除法先去做,举个例子样例564
564/111=5
564%111=9
9/11=0
9%11=9
9/1=9
我们将每次找到的数拼起来就变成了原来的数509
是不是很神奇
那么问题来了:**从几个1开始入手呢?** 其实很简单我们可以从16个1开始入手,因为除得0,加一个前缀0,放在int里,会自动删除呀
所以,我们的代码来了
```cpp
#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;
}
```
我打了一个表,当然大家也可以递推做这个表,或不用数组
```cpp
#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;
}
```
不过注意10^16要开longlong哦