欢迎访问我的pat顶级题解目录哦 https://blog.csdn.net/richenyunqi/article/details/86751676
题目描述
算法设计
这是一道寻找规律的题目。以串1023
为例:
- 以1开始的串有
1
、10
、102
、1023
。这4个数的总和为 1 + 10 + 102 + 1023 = 1 × 1111 + 0 × 111 + 2 × 11 + 3 × 1 1+10+102+1023=1×1111+0×111+2×11+3×1 1+10+102+1023=1×1111+0×111+2×11+3×1 - 以0开始的串不计入
- 以2开始串有
2
、23
。这2个数的总和为 2 + 23 = 2 × 11 + 3 × 1 2+23=2×11+3×1 2+23=2×11+3×1 - 以3开始的串有
3
,其总和为 3 × 1 3×1 3×1
如此我们便找到了规律。可以定义一个vector
存储每一位对应的所要乘的因子,由于最终结果需要对1000000007
取模,可以先让这些所要乘的因子对1000000007
取模。然后从低位向高位进行相乘并累加即可。
C++代码
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
cin>>s;
long long ans=0,sum=0,mod=1000000007;
vector<long long>v(s.size(),1);
for(int i=v.size()-2;i>=0;--i)//计算每一位对应的所要乘的因子
v[i]=(v[i+1]*10+1)%mod;
for(int i=v.size()-1;i>=0;--i)//从低位向高位进行相乘并加和
if(s[i]!='0'){
sum+=v[i]*(s[i]-'0');
ans=(ans+sum)%mod;
}
printf("%lld",ans);
return 0;
}