您的位置:首页 > 其它

无限循环小数的分数和校外的树~

2010-02-02 10:46 295 查看
做了几个编程爱好者上的题,突然响起了当时在学校编程大赛的时候复赛的最后一个题,也就是我唯一一个没做上来的,结果与一等奖失之交臂……

无限循环小数的分数表达式

后来回去后用等比数列之和求极限做出了他的公式,现在写上,聊表纪念吧。

//============================================================================
// Name        : ACM.cpp
// Author      : Yin Xusen
// Version     :
// Copyright   : Your copyright notice
// Description : 将无限循环小数转换为分数
//============================================================================
#include <iostream>
using namespace std;
#define LMAX 100
int main() {
char Input[LMAX];
int BeforeBit,AfterBit;
int BeforeBitTen = 1,AfterBitTen = 1;
int BeforeInt = 0,AfterInt = 0;
int AnswerUp,AnswerDown;
int tmp[LMAX];
int i,j;
cout<<"输入格式:0.xx(xxx)"<<endl;
cout<<"输入>";
cin>>Input;
for(i = 2; Input[i] != '('; i++)
tmp[i - 2] = Input[i] - '0';
BeforeBit = i - 2;
for(j = 0; j < BeforeBit; j++)  //日,错把异或当成了几次方!
{
BeforeBitTen *= 10;
int xtmp = BeforeBit - 1 - j;
int ytmp = 1;
for (int k = 0; k < xtmp; k++)
ytmp *= 10;
BeforeInt += tmp[j] * ytmp;
}
i++;
for(i; Input[i] != ')'; i++)
tmp[i - BeforeBit - 3] = Input[i] - '0';
AfterBit = i - BeforeBit - 3;
for(j = 0; j < AfterBit; j++)
{
AfterBitTen *= 10;
int xtmp = AfterBit - 1 - j;
int ytmp = 1;
for (int k = 0; k < xtmp; k++)
ytmp *= 10;
AfterInt += tmp[j] * ytmp;
}

AnswerDown = BeforeBitTen * (AfterBitTen - 1);
AnswerUp = (AfterBitTen - 1) * BeforeInt + AfterInt;
cout << AnswerUp << endl;
cout << "------" << endl;
cout << AnswerDown <<endl;

return 0;
}


=====================================================================================

校门外的树

【问题描述】
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

【输入文件】
输入文件tree.in的第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

【输出文件】
输出文件tree.out包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

【样例输入】
500 3

150 300

100 200

470 471

【样例输出】
298

【数据规模】
对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。
//input: L[1,10000],M[1,100]    文件tree.in
//output: 马路上剩余树的数目             文件tree.out
//先不用文件试试
#include <iostream>
using namespace std;
#define MAX 10000
#define MIN 100
typedef struct{
int Left;
int Right;
}Position;
int main()
{
int i = 0;
int l,m;
int TreePos[MAX] = {0};
int count = 0;
Position M[MIN];
cout<<"输入L和M>";
cin>>l>>m;
cout<<endl<<"输入"<<m<<"个区间>";
for(i ; i < m ; i++)
{
cin>>M[i].Left>>M[i].Right;
for(int j = M[i].Left ; j <= M[i].Right ; j++)
TreePos[j]++;
}
for(i = 0; i < l; i++)
if(TreePos[i] == 0)
count++;
cout<<count;

return 0;
}

这个题如果不计时间空间复杂度的话还是比较简单的。但是如果要论起来那就有点不好做了。关于逻辑方面以及比较什么的。
要求用文件操作我没用,以后补上。
最近比较纠结,几乎是把Windows32位汇编看过一遍了,但是越看越觉得一般,底层的东西是很详尽,但是学到最后觉得除了非常底层的外其他的都没什么必要去学。win32汇编毕竟和DOS IBM-PC时代的汇编不一样了,不论你怎么努力,终究是突破不了人家的权限,保护模式下的汇编程序设计尽管比较简单,但是除了其重定位的优势外,其他的和windows c编程还差不多。都是用人家的API.
最最关键的是没有一个良好的IDE环境...
最近学Linux的时候刚学完其进程的控制。是读写源码比较好呢?还是再往下把编程先看完比较好呢?Linux的优势到底何在?是为了拿来学OS?还是为了嵌入式开发?还是为了用于服务器的运作?纠结~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: