题解 P1898 【缘分计算】

__Chtholly

2020-10-31 09:07:12

Solution

## 一道水题 其实这道题真不难(假的 但是想要想全很难 **思路:①将读入的串的某位值+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++!