1086: Round and Round We Go
按照题目意思操作输入一串字符,注意前面可以有多个0,然后就是大数乘小数问题。
从2开始乘乘到该字符串的长度len。
首先如果相乘结果比原字符串位数多可以直接排除了。
否侧每次得到一个答案就循环这个字符串直到能和原字符串匹配。
我一直WA的原因应该是直接遍历结果字符串寻找到第一个与原字符串第一个字符匹配的地方然后取余,发现有相同字符的时候就不行的,还有前导0迷惑了我想太多了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
//#define ll long long int
using namespace std;
char a[60];
int res[60];
int num[60];
int main(int argc, char const *argv[])
{
while(scanf("%s",a)!=EOF){
memset(num,0,sizeof(num));
for(int i=0;i<strlen(a);i++)num[i]=a[strlen(a)-i-1]-'0';
int key = num[strlen(a)-1];
int f;
for(int i=2;i<=strlen(a);i++){
memset(res,0,sizeof(res));
int len=strlen(a);
for(int j = 0; j < len; j++){ //高精度乘小数,先存每个位的值
res[j] = num[j] * i;
}
for(int j = 0; j < len-1; j++){ //除了最高位其他位要除10进位
res[j+1] += res[j]/10;
res[j] %= 10;
}
if(res[len-1] > 9){ //保证最高位不能大于10,否则直接排除
f = 0;
break;
}
f=0;
int s=0;
while(s<strlen(a)){ //每次从0开始对结果答案循环取余,直到能否和原字符串匹配
int o=0;
while(o<strlen(a)){
if(res[(o+s)%strlen(a)]!=num[o]){
break;
}
o++;
}
if(o==strlen(a)){
f=1;
break;
}
s++;
}
if(!f)break;
}
if(!f)printf("%s is not cyclic\n",a);
else printf("%s is cyclic\n",a);
}
return 0;
}
题目是不难,是我太蠢