模拟 --- hdu 12878 : Fun With Fractions
#
Mean:
给你n个数,其中包含分数、整数,对这n个数求和。
analyse:
按照题目意思模拟即可,主要考察coding能力.
Time complexity:O(n)
Source code:
//Memory Time
// K MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 1005
#define LL long long
using namespace std;
int n,kase=1;
int flag[MAX];
char str[MAX][20];
void read()
{
memset(flag,0,sizeof(flag));
for(int i=1;i<=n;i++)
{
scanf("%s",str[i]);
int len=strlen(str[i]);
for(int j=0;j<len;j++)
{
if(str[i][j]==',')
{
flag[i]=1;
break;
}
else if(str[i][j]=='/')
{
flag[i]=2;
break;
}
}
}
}
int gcd(int a,int b)
{
if(b==0)
return a;
else return gcd(b,a%b);
}
int lcm(int a,int b)
{
int x=gcd(a,b);
return a*b/x;
}
void solve()
{
int num;
int zi=1,mu=1;
for(int i=1;i<=n;i++)
{
int a,b;
if(flag[i]==0) // 6
{
sscanf(str[i],"%d",&num);
zi+=mu*num;
continue;
}
else if(flag[i]==1) // 6,5/3
{
sscanf(str[i],"%d,%d/%d",&num,&a,&b);
zi+=mu*num;
}
else // 5/3
{
sscanf(str[i],"%d/%d",&a,&b);
}
int newmu=lcm(mu,b);
int newa=(newmu/b)*a;
int newzi=(newmu/mu)*zi;
zi=newzi+newa;
mu=newmu;
if(zi%mu==0)
{
zi=zi/mu;
mu=1;
continue;
}
}
zi-=mu;
if(gcd(zi,mu)!=1)
{
int tmp=gcd(zi,mu);
zi/=tmp;
mu/=tmp;
}
if(zi==0||mu==0)
{
puts("0");
return ;
}
if(zi>=mu)
{
if(zi%mu==0)
{
printf("%d\n",zi/mu);
return ;
}
else
{
int integer=0;
while(zi>mu)
{
zi-=mu,integer++;
}
printf("%d,%d/%d\n",integer,zi,mu);
return ;
}
}
else
printf("%d/%d\n",zi,mu);
}
int main()
{
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
while(~scanf("%d",&n),n)
{
read();
printf("Test %d: ",kase++);
solve();
}
return 0;
}
// K MS
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<vector>
#include<queue>
#include<stack>
#include<iomanip>
#include<string>
#include<climits>
#include<cmath>
#define MAX 1005
#define LL long long
using namespace std;
int n,kase=1;
int flag[MAX];
char str[MAX][20];
void read()
{
memset(flag,0,sizeof(flag));
for(int i=1;i<=n;i++)
{
scanf("%s",str[i]);
int len=strlen(str[i]);
for(int j=0;j<len;j++)
{
if(str[i][j]==',')
{
flag[i]=1;
break;
}
else if(str[i][j]=='/')
{
flag[i]=2;
break;
}
}
}
}
int gcd(int a,int b)
{
if(b==0)
return a;
else return gcd(b,a%b);
}
int lcm(int a,int b)
{
int x=gcd(a,b);
return a*b/x;
}
void solve()
{
int num;
int zi=1,mu=1;
for(int i=1;i<=n;i++)
{
int a,b;
if(flag[i]==0) // 6
{
sscanf(str[i],"%d",&num);
zi+=mu*num;
continue;
}
else if(flag[i]==1) // 6,5/3
{
sscanf(str[i],"%d,%d/%d",&num,&a,&b);
zi+=mu*num;
}
else // 5/3
{
sscanf(str[i],"%d/%d",&a,&b);
}
int newmu=lcm(mu,b);
int newa=(newmu/b)*a;
int newzi=(newmu/mu)*zi;
zi=newzi+newa;
mu=newmu;
if(zi%mu==0)
{
zi=zi/mu;
mu=1;
continue;
}
}
zi-=mu;
if(gcd(zi,mu)!=1)
{
int tmp=gcd(zi,mu);
zi/=tmp;
mu/=tmp;
}
if(zi==0||mu==0)
{
puts("0");
return ;
}
if(zi>=mu)
{
if(zi%mu==0)
{
printf("%d\n",zi/mu);
return ;
}
else
{
int integer=0;
while(zi>mu)
{
zi-=mu,integer++;
}
printf("%d,%d/%d\n",integer,zi,mu);
return ;
}
}
else
printf("%d/%d\n",zi,mu);
}
int main()
{
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
while(~scanf("%d",&n),n)
{
read();
printf("Test %d: ",kase++);
solve();
}
return 0;
}
作者:北岛知寒
出处:https://www.cnblogs.com/crazyacking/p/3901724.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?