TZOJ 1086: Round and Round We Go

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;
}

题目是不难,是我太蠢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值