看到字符串就头疼啊。。。。
超麻烦
//Aizu 1180 Recurring Decimals
//字符串
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string aaaa[7]={
"0","0","00","000","0000","00000","000000"
};
bool ba(char a, char b)
{
return a>b;
}
bool ab(char a, char b)
{
return a<b;
}
string Sub(string a,string b) //计算 a-b
{
string c=a;
int lena=a.length(),lenb=b.length(),lenc,i,j;
for(i=lena-1,j=lenb-1;j>=0;j--,i--)
{
c[i]='0'+a[i]-b[j];
}
lenc=c.length();
for(i=lena-1;i>0;i--)
{
if(c[i]<'0')
{
c[i]+=10;
c[i-1]--;
}
}
// cout<<"c="<<c<<endl;
// cout<<c<<endl;
return c;
}
string fun(string x) //由 a【i】计算a【i+1】
{
string a,b,c;
sort(x.begin(),x.end(),ba); //从大到小排序
a=x;
sort(x.begin(),x.end(),ab); //从小到大排序
b=x;
return Sub(a,b);
}
int main()
{
string x,a[101];
int i,j,k,l,L,flag,lenx;
while(cin>>x>>L)
{
if(x=="0"&&L==0) break;
lenx=x.length();
if(lenx<L)
{
x=aaaa[L-lenx]+x;
}
//得到了 a0
a[0]=x;
flag=0;
for(i=1;i<=100;i++)
{
a[i]=fun(a[i-1]);
for(j=0;j<i;j++)
{
if(a[j]==a[i])
{
flag=1;
break;
}
}
if(flag) break;
}
//-----------------------------------------------------------------------
// 清空a[i]中没有意义的'0'
bool flag=0;
for(k=0;k<a[i].length();k++)
{
if(a[i][k]!='0')
{
flag=1; //a[i]!=0
// if(k==0) break;
for(l=0;k<a[i].length();l++,k++)
{
a[i][l]=a[i][k];
}
a[i]=a[i].erase(l,a[i].length()-l);
break;
}
}
if(flag==0) a[i]="0";
//------------------------------------------------------------------------
cout<<j<<" "<<a[i]<<" "<<i-j<<endl;
}
return 0;
}
本文提供了一份解决Aizu1180循环小数问题的C++代码示例,通过字符串操作实现了从给定数字串出发寻找循环节的过程。文章通过定义多个辅助函数完成了字符串大小排序、相减等操作,并最终输出了循环节开始的位置及循环节本身。

被折叠的 条评论
为什么被折叠?



