题解 P1898 【缘分计算】
__Chtholly
2020-10-31 09:07:12
## 一道水题
其实这道题真不难(假的
但是想要想全很难
**思路:①将读入的串的某位值+ST ②将这个经过转换的值一位一位装入一个=字符串数组,后面进行模拟 ③进行简单递推(或者说是模拟**
### ①处理:
```cpp
for(register int i=1;i<=n;++i)//转换成数字
b[i]=ch[i]-'A'+ST;
```
### ②处理
```cpp
void kkkAKIOI()//将数字处理成字符串
{
for(register int i=n;i>=1;--i)
{
while(b[i])
{
maked[++len]=b[i]%10+'0';
b[i]/=10;
}
}
return ;
}
```
### ③处理
```
void work()
{
while(len-2&&(maked[1]!='0'||maked[2]!='0'||maked[3]!='1'))//"len-2"为判断是不是二位数,001特判有没有100的情况
{
for(int i=1;i<=len-1;++i)
maked[i]=(maked[i]-'0'+maked[i+1]-'0')%10+'0';
len--;//长度-1
// for(register int i=1;i<=len;++i)
// printf("%c",maked[i]);
// printf("\n");
}
int cl_zero=len;//处理前导0
while(maked[cl_zero]=='0')cl_zero--;
for(register int i=cl_zero;i>=1;--i)
printf("%c",maked[i]);
}
```
我们提交,发现:
![](https://i.loli.net/2020/10/31/hNirEgDCUIJxnft.png)
#### 啊?为什么这样子啊!!!
我们得冷静分析一下
最终我们盯住这一行:
```cpp
int cl_zero=len;//处理前导0
while(maked[cl_zero]=='0')cl_zero--;
for(register int i=cl_zero;i>=1;--i)
printf("%c",maked[i]);
```
然后我们想:会不会出现**全是0**的情况呢?
创个数据:
![](https://i.loli.net/2020/10/31/hz4NDvr26BWlLqZ.png)
#### 果然!
![](https://i.loli.net/2020/10/31/p7D8XhN6bALn4Gc.png)
为啥啥都没有呢?
我们可以看出:若出现全是0的情况,就会被当作前导0**全部删除**!
##### 最终,~~作为蒟蒻的我~~,只能写一个putcha来检查是否有输出,如果有,就是已经输出答案了;若无,则最终输出0
### ③改完后的代码
```cpp
void work()
{
while(len-2&&(maked[1]!='0'||maked[2]!='0'||maked[3]!='1'))//"len-2"为判断是不是二位数,001特判有没有100的情况
{
for(int i=1;i<=len-1;++i)
maked[i]=(maked[i]-'0'+maked[i+1]-'0')%10+'0';
len--;//长度-1
// for(register int i=1;i<=len;++i)
// printf("%c",maked[i]);
// printf("\n");
}
int cl_zero=len;//处理前导0
int putcha=0;//有没有全为0的情况
while(maked[cl_zero]=='0')cl_zero--;
// printf("%d\n",cl_zero);
for(register int i=cl_zero;i>=1;--i)
printf("%c",maked[i]),putcha++;//输出 //若有全为0的情况,putcha必为1
if(putcha==0)
printf("0");
}
```
最终:[完美ac!](https://www.luogu.com.cn/record/40867952)
~~PS:接下来才是正片~~
## 献上我的代码
```cpp
#include<cstdio>
#include<cstring>
#include<string>
int n;
char ch[15];
int b[15];
int ST;
char maked[105],len;
void kkkAKIOI()//将数字处理成字符串
{
for(register int i=n;i>=1;--i)
{
while(b[i])
{
maked[++len]=b[i]%10+'0';
b[i]/=10;
}
}
return ;
}
void work()
{
while(len-2&&(maked[1]!='0'||maked[2]!='0'||maked[3]!='1'))//"len-2"为判断是不是二位数,001特判有没有100的情况
{
for(int i=1;i<=len-1;++i)
maked[i]=(maked[i]-'0'+maked[i+1]-'0')%10+'0';
len--;//长度-1
// for(register int i=1;i<=len;++i)
// printf("%c",maked[i]);
// printf("\n");
}
int cl_zero=len;//处理前导0
int putcha=0;//有没有全为0的情况
while(maked[cl_zero]=='0')cl_zero--;
// printf("%d\n",cl_zero);
for(register int i=cl_zero;i>=1;--i)
printf("%c",maked[i]),putcha++;//输出 //若有全为0的情况,putcha必为1
if(putcha==0)
printf("0");
}
int main()
{
scanf("%s\n",(ch+1));
n=strlen(ch+1);
scanf("%d",&ST);
for(register int i=1;i<=n;++i)//转换成数字
b[i]=ch[i]-'A'+ST;
kkkAKIOI();//再转换成字符串
// for(register int i=len;i>=1;--i)
// printf("%c",maked[i]);
work();//最后模拟
return 0;
}
```
# 最终:祝大家NOIP2020 rp++!