第1题:数的分解
这是一道数学题,有一定的难度,但是结合数学思考就可以迎刃而解了。
具体方法:
先做一个例子:比如四为数abcd(当然上面有一条横线)
它等于
1000a+100b+10c+d
去掉个位则是
100a+10b+c
继续去做是
10a+b
继续去做是
a
我们把它们加在一起是
1111a+111b+11c+1d
这么多个1,显然是突破口,那么我们就可以用除法先去做,举个例子样例564
我们将每次找到的数拼起来就变成了原来的数
是不是很神奇
那么问题来了:从几个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;
}
不过注意
要开 longlong
哦