第1题:数的分解

kradcigam

2019-07-21 14:01:02

Personal

# 第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哦