Aizu 1180 Recurring Decimals

本文提供了一份解决Aizu1180循环小数问题的C++代码示例,通过字符串操作实现了从给定数字串出发寻找循环节的过程。文章通过定义多个辅助函数完成了字符串大小排序、相减等操作,并最终输出了循环节开始的位置及循环节本身。

Aizu 1180 Recurring Decimals

 

看到字符串就头疼啊。。。。

超麻烦

 

 

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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值