usaco ★Fractions to Decimals 分数化小数

★Fractions to Decimals 分数化小数
写一个程序,输入一个形如 N/D 的分数(N 是分子,D 是分母),输出它的小数形式。
如果小数有循环节的话,把循环节放在一对圆括号中。例如,
1/3 = .33333333 写成 0.(3)
41/333 = 0.123123123... 写成 0.(123)
用 xxx.0 成表示整数
典型的转化例子:
1/3 = 0.(3)
22/5 = 4.4
1/7 = 0.(142857)
2/2 = 1.0
3/8 = 0.375
45/56 = 0.803(571428)
PROGRAM NAME: fracdec
INPUT FORMAT
单独的一行包括被空格分开的 N 和 D, 1 <= N,D <= 100000。
SAMPLE INPUT  (file fracdec.in)
45 56
OUTPUT FORMAT
小数的表示方法上面说的很明白了,如果输出的长度超过 76 个字符,每行输出 76 个。
SAMPLE OUTPUT (file fracdec.out)

0.803(571428)

这是昨天补得三题最后一题也是第二章的最后一题,这题花了我太长时间在输出格式上面,好烦交了11次。

还有一题比这个难考数学,不考格式的有兴趣的可以尝试一下:点击打开链接代码我也放上来解释在我前面的一篇文章有很详细。

usaco题目。
/*
ID:jinbo wu
TASK:fracdec
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
int v[100005];
char a[1000000];
char  b[10000];
int gcd(int n,int m)
{
	return m==0?n:gcd(m,n%m);
}
int main()
{
	freopen("fracdec.in","r",stdin);
	freopen("fracdec.out","w",stdout);
	int n,m,flag;
	cin>>n>>m;
	int temp=gcd(n,m);
	n/=temp;
	m/=temp;
	temp=n/m;
	int l=0;
	do
	{
		b[++l]=48+temp%10;
		temp/=10;
	}while(temp);
	for(int i=1;i<=l;i++)
	a[i]=b[l-i+1];
	a[++l]='.';
	int cnt=l;
	v[n%m]=++l;
    n=(n%m)*10;
    a[l]=48+(n/m)%10;
	while(1)
	{
	   temp=n%m;
	   if(v[temp])
	   {
	   	flag=v[temp];
	   	if(temp==0)
	   	{
	   	 flag=0;
	   	 if(l-cnt>1)
	   	 l--;
	    } 
	    break;
	   }
	   v[temp]=++l;
	   n=(n%m)*10; 
	   int t=(n/m)%10;
	   a[l]=48+t;
	 
	}
	int len=1;
	int k=l;
	cnt=0;
   	  for(int i=1;i<=l;i++)
   	 {
   	 	if(flag!=0)
   	 	{
			
   	 	 if(len==flag)
   	 	 {
   	 	 cout<<"(";
   	 	 cnt++;
   	 	 if(cnt%76==0)
   	 	 cout<<endl;
   	     }
   	 	 cout<<a[len];
   	 	 cnt++;
   	     if(len==l)
   	     {
   	      cout<<")";
   	      cnt++;
   	      if(cnt%76==0)
   	      cout<<endl;
   	      }
   	     len++;
   	     if(cnt%76==0)
   	     cout<<endl;
   	    }
   	   else {
   	         cout<<a[len++];
   	         if((len-1)%76==0)
   	         cout<<endl;
		  }
	 }
	 cout<<endl;
	
}



循环节长度

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
    return b?gcd(b,a%b):a;
}
ll pow(ll n,ll m,ll q)
{
	ll ans=1;
	while(m)
	{
		if(m&1)
		ans=ans*n%q;
		n=n*n%q;
		m>>=1;
	}
	return ans;
}
ll euler(ll n)
{
	ll ans=n;
	for(ll i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			n/=i;
			ans=ans/i*(i-1);
		}
		while(n%i==0) n/=i;
	}
	if(n>1)
	ans=ans/n*(n-1);
	return ans;
}
int main()
{
	ll p,q;
	while(~scanf("%lld %lld",&p,&q))
	{
		q/=gcd(p,q);
		while(q%2==0) q/=2;
		while(q%5==0) q/=5;
		if(q==1)
		{
			printf("0\n");
			continue;
		}
		ll t=euler(q);
		ll temp=sqrt(t);
		int flag=0;
		for(ll i=1;i<=temp;i++)
		{
			if(t%i) continue;
			if(pow(10,i,q)==1)
			{
				printf("%lld\n",i);
				flag=1;
				break;
			}
		}
		if(flag)
		continue;
		for(int i=temp;i>=1;i--)
		{
			if(t%i) continue;
			if(pow(10,t/i,q)==1)
			{
			printf("%lld\n",t/i);
			break;
		    }
		}
	}
}



在P1458 USACO 2.1 有序分数 Ordered Fractions 的题目中,你需要处理一组分数,每个分数由两个整数表示,即分子m和分母d,然后对这些分数按照它们的小数形式进行非递减排序。以下是解决这个问题的一般步骤: 1. **创建结构体**: 定义一个包含分子和分母的结构体或类,例如在C++中可以是`struct Fraction { int numerator; int denominator; }`。 2. **转换为小数**: 对于每个分数,需要将其转换为浮点数以便进行比较。这可以通过除法操作 `float fraction = (float)m / d;` 来完成。 3. **比较函数**: 编写一个用于比较两个分数大小的函数,通常通过比较它们的小数形式。如果分数a小于b,则返回负数;等于则返回0;大于则返回正数。 ```cpp bool compareFractions(const Fraction &a, const Fraction &b) { return a.numerator * b.denominator > b.numerator * a.denominator; } ``` 4. **排序算法**: 使用适当的排序算法,如`std::sort`(对于C++),对分数数组进行排序。这里,你可以传递自定义的比较函数给`sort`,它会根据这个函数的规则对元素进行排序。 ```cpp std::vector<Fraction> fractions; // ... 添加分数fractions列表中 std::sort(fractions.begin(), fractions.end(), compareFractions); ``` 5. **存储结果**: 排序完成后,数组`fractions`就包含了按照要求排列的分数。注意,由于原题可能要求输出的是字符串形式,因此在存储之前可能还需要遍历数组,将每个分数转换回字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值