一些做的过的零散的题目(poj)

1.这次做这么些题也不是为了ACM什么的,主要是实验室的项目内容太水了,而且跟自己喜欢的方向差太多了。所以,通过这些练习,锻炼一些编码水平和准确度,顺便巩固下基础,学习一些一些解决问题的算法思想。刚开始做的题目类型都很混乱没有一些分类,后来跟着HD的acm课ppt,将问题归类,系统的学习。

这些题目包括从poj的1000到1009一共十道题现在一起总结一下:总结包括一些算法细节和数据结构的选取和边缘情况,方便以后查阅。

1000:

A+B。看了一下board版发现:各种语言的平均time和memory从少到多 :Pascal<C<C++<Fortan、Java。其他题中也是大概这么分布。当然我喜欢用C++

1001:

题目大意:给定一个数字R(00.000<R<99.999)和一个整数n(0<n<=25),让求高精度的R^n(R的n次方)并按要求严格打印输出。

解题思想:将R转换成一个整数,并用一个变量loc记录小数的位数,最后通过控制格式输出答案。

使用int answer[SIZE] 存放输出数据,char R[20] 存放输入数据。需要注意的情况:输入第一位为0、小数位后几位为0应该忽略0。零次幂的情况和没有整数位的情况。

完整代码如下:

#include <stdio.h>
#include <string.h>

#define SIZE 200

int main()
{
	char R[20];
	int n;//幂次

	int answer[SIZE];//答案数组。
	while(scanf("%s %d", R, &n)!=EOF)
	{
		int num = 0;//存放底数
		int loc = 0;//小数位数。

		if(n == 0){
			printf("%d\n", 1);
			continue;
		}

		for(int i=0; i<strlen(R); i++)//将R转换成num
		{
			if(R[i] == '.')	{
				loc = strlen(R) - i -1;
				continue;
			}
			num = num*10 + R[i] - '0';
		}
		
		if( loc>0 )
		{
			for(int i=strlen(R)-1; R[i]=='0'; i--,loc--)
			{
				num /= 10;
			}
		}//小数位后有0的情况
		if(num == 0)
		{	printf("0\n"); continue;   }
		loc *= n;//小数位。
		int temp;
		for(int i=0, temp=num; i<SIZE; i++, temp /= 10)
		{
			answer[i] = temp%10;
		}//将num放入数组中。
		int rest = 0;
		for(int i=0; i<n-1; i++)
		{
			for(int j=0; j<SIZE; j++)
			{
				answer[j] = answer[j]*num + rest;
				rest = answer[j] /10;
				answer[j] = answer[j] % 10;
			}
		}
		int i=0;//answer中不为0的长度
		for(i=SIZE-1;i>=0;i--)
			if(answer[i]!=0)
				break;
				
		if(loc > i)//如果没有整数位
		{
			printf(".");
			for(int j=loc-1;j>=0;j--)
				printf("%d",answer[j]);
		}
		else
		{
			for(;i>loc-1;i--)
				printf("%d",answer[i]);
			if(i>=0)
				printf(".");
			for(;i>=0;i--)
				printf("%d",answer[i]);
		}
		printf("\n");

	}
	return 0;
}
求用数组算乘法的核心:

for(int i=0;i<n-1;i++)
{
	for(int j=0;j<SIZE;j++)
	{
		answer[j] = answer[j]*num +rest;
		rest = answer[j] /10;
		answer[j] = answer[j] % 10;
	}
}

1002:

电话号码的问题:包括数据的插入,稳定排序,和按序输出。本来用一个纯STL  map< vector<string> int >写了一个但是一直超时,后来改用map< int, int > AC 但是还用了766MS。所以以后要避免使用模板。但遇到让输入n来决定输入次数的时:使用for(int i=0; i<n; i++) 而不使用while(n--)


#include <stdio.h>
#include <string.h>
#include <map>

using namespace std;


int main()
{
	char marray[100];
	marray['1']='1';
	marray['0']='0';
	marray['A']=marray['B']=marray['C']=marray['2']='2';
	marray['D']=marray['E']=marray['F']=marray['3']='3';
	marray['G']=marray['H']=marray['I']=marray['4']='4';
	marray['J']=marray['K']=marray['L']=marray['5']='5';
	marray['M']=marray['N']=marray['O']=marray['6']='6';
	marray['P']=marray['R']=marray['S']=marray['7']='7';
	marray['T']=marray['U']=marray['V']=marray['8']='8';
	marray['W']=marray['X']=marray['Y']=marray['9']='9';
	
	map<int,int> S;
	char buf[200];
	int t;
	bool flag = false;
	scanf("%d",&t);
	for(int i=0;i<t;i++)
	{
		int c = 0;//将电话号码转换成int类型。
		scanf("%s",&buf);
		for(int j=0; buf[j]; j++)
		{
			if(buf[j]=='Q'|| buf[j]=='-'|| buf[j]=='Z')
				continue;
			buf[j] = marray[buf[j]];	
			c = c*10 + buf[j]-'0';
		}
		S[c]++;//插入
	}
	for(map<int,int>::iterator it=S.begin(); it!=S.end();it++)
	{
		if(it->second>1)
		{
			printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second);
			flag = true;
		}		
	}	
	if(!flag)
		printf("No duplicates.\n");

	//printf("%03d\n",t);

	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值