OpenJudge NOI 1.13 06:循环数

【题目链接】

OpenJudge NOI 1.13 06:循环数

【题目考点】

1. 字符串
2. 枚举
3. 高精度计算 高精乘低精

【解题思路】

用string类对象保存输入的数字,该数字为一个高精度数字。

  • 完成高精乘低精函数mult,实现该string类对象表示的数字乘以一个int类型的整数,结果为string类对象。
  • 完成函数isSame,传入两个字符串st,s,判断这两个数字字符串是否循环相等。
    字符串s首尾相接再从某处断开,断开点可以是当前字符串的下标i的位置,原字符串下标0~i-1为子串s1,下标i到末尾为子串s2,再将s1接在s2的右边(也就是首尾相接),该字符串即为将原字符串首位相接后再在下标i位置断开后得到的字符串。
    尝试从s的每个可能的位置断开,再首尾相接,构造新的字符串,看该字符串与st是否相等。如果存在相等的情况,则认为二者循环相等。否则不相等。
  • 输入数字字符串,该字符串的长度即为n。i从1循环到n,用该数字字符串乘以i,如果得到的结果位数大于n,则不考虑。如果等于n,则看这个字符串和原字符串是否循环相等。如果存在这种情况,输出1,否则输出0。

【题解代码】

解法1:
#include <bits/stdc++.h>
using namespace std;
string mult(string s, int a)
{
    int c = 0, d;
    for(int i = s.length()-1; i >= 0; i--)
    {
        d = (s[i]-'0')*a+c;
        c = d/10;
        s[i] = d%10+'0';
    }
    if(c > 0)//如果乘完位数变多,则不考虑这种情况,直接返回空字符串 
        return string("");
    else
        return s;
}
bool isSame(string st, string s)//s是否与st循环相等
{
    string s1, s2;
    if(s.length() != st.length())//如果二者长度不等,那么肯定不同。 
        return false;
    for(int i = 0; i < s.length(); ++i)//下标0~i-1为子串s1,下标i到末尾为子串s2 
    {
        s1 = s.substr(0, i);
        s2 = s.substr(i, s.length()-i);
        if(s2+s1 == st)//s1接在s2右侧,看是否与st相同 
            return true;
    }
    return false;
}
int main()
{
    string s, st;
    cin >> st;
    for(int i = 1; i <= st.length(); ++i)
    {
        s = mult(st, i);
        if(isSame(st, s) == false)
        {
            cout << 0;
            return 0;
        }
    }
    cout << 1;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值