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