【题目链接】
【题目考点】
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;
}