您的位置:首页 > 其它

poj1000-1002

2014-05-11 20:32 204 查看
1000

num 1000

#include <iostream>

using namespace std;

int main()
{
int a,b;
cin >> a >> b;
cout << a+b << endl;
return 0;
}

poj 1001
version:1.0
author:Knight
Email:S.Knight.Work@gmail.com

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<memory.h>
using namespace std;

char Result[200];//存R^N的结果

//大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中
void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result);
//剔除实数尾部的无效0或小数点
void CutInsignificantTail(char* StrR);
//计算小数点在实数中的位数
int CountPointIndex(char* StrR);
//删除实数中的小数点,PointIndex为小数点在实数中从右向左数的第几位
void DeletePoint(char* StrR, int PointIndex);

int main(void)
{
char StrR[10];//R对应的字符串
int N;
int i;
int PointIndex = 0;//记录小数点在实数中从右向左数的第几位,如数字1.26在第3位,数字4的小数点在第0位

while(scanf("%s%d", StrR, &N) != EOF)
{
memset(Result, 0, 200);

CutInsignificantTail(StrR);

PointIndex = CountPointIndex(StrR);//compute the dot position

DeletePoint(StrR, PointIndex);

strcpy(Result, StrR);

for (i=2; i<=N; i++)
{
HigRealMul(Result, StrR, Result);
}

int Len = strlen(Result);

if (Len -(PointIndex - 1) * N < 0)
{
printf(".");
for (i = Len - (PointIndex - 1) * N; i<0; i++)
{
printf("0");
}
}

for (i=0; i<Len; i++)
{
//输出小数点
if (i == Len -(PointIndex - 1) * N)
{
printf(".");
}
printf("%c", Result[i]);
}
printf("\n");
//printf("%s\n", Result);
//printf("%d\n", PointIndex);
}
return 0;
}

//大实数的乘法,乘数为FirMultiplier和SecMultiplier,结果存在Result中
void HigRealMul(char* FirMultiplier, char* SecMultiplier, char* Result)
{

char TmpResult[200];
int i,j;
int k = -1;//控制TmpResult[]下标
int FirLen = strlen(FirMultiplier);
int SecLen = strlen(SecMultiplier);

memset(TmpResult, '0', 200);

//模拟乘法运算
for (i=SecLen-1; i>=0; i--)
{
k++;

int FirMul;
int SecMul = SecMultiplier[i] - '0';
int Carry;//进位

for (j=FirLen-1; j>=0; j--)
{
FirMul = FirMultiplier[j] - '0';
TmpResult[k + FirLen - 1 - j] +=   FirMul * SecMul % 10;
Carry = FirMul * SecMul / 10 + (TmpResult[k + FirLen - 1 - j] - '0') / 10;
TmpResult[k + FirLen - 1 - j] = (TmpResult[k + FirLen - 1 - j] - '0') % 10 + '0';
TmpResult[k + FirLen - j] += Carry;
}
}

//防止某一位的值超过9
for (k=0; k<200; k++)
{
TmpResult[k + 1] += (TmpResult[k] - '0') / 10;
TmpResult[k] = (TmpResult[k] - '0') % 10 + '0';
}
//将设置字符串结束符
for (k=199; k>=0; k--)
{
if ('0' != TmpResult[k - 1])
{
TmpResult[k] = '\0';
break;
}
}

//将临时存储的答案TmpResult倒转变成我们熟悉的方式,存到Result中
for (i=strlen(TmpResult)-1,j=0; i>=0; i--,j++)
{
Result[j] = TmpResult[i];
}
Result[j] = '\0';

}

//剔除实数尾部的无效0或小数点
void CutInsignificantTail(char* StrR)
{
int i;
int PointIndex = CountPointIndex(StrR);
int Len = strlen(StrR);

if (0 == PointIndex)
{
if ('.' == StrR[Len - 1])
{
StrR[Len - 1] = '\0';
}

return;
}

for (i=Len-1; i>Len-1-PointIndex; i--)
{
if ('0' == StrR[i] || '.' == StrR[i])
{
StrR[i] = '\0';
}
else
{
return ;
}
}
}

//计算小数点在实数中的位数
int CountPointIndex(char* StrR)
{
int i;
int Index = 0;

for (i = strlen(StrR); i>=0; i--)
{

if ('.' == StrR[i])
{
break;
}
else
{
Index++;
}
}

if (-1 == i)
{
Index = 0;
}

return Index;

}

//删除实数中的小数点
void DeletePoint(char* StrR, int PointIndex)
{
int i;
int Len = strlen(StrR);

for (i=strlen(StrR)-PointIndex; i<Len; i++)
{
StrR[i] = StrR[i+1];
}
}


1002 电话号码的去重和统计

#include<iostream>
#include<string>
#include<stdlib.h>
#include<cstdio>
#include<cstring>
using namespace std;
int numint[110000]={0};
char number[110000][100]={0};
int compare(const void *a, const void *b)
{
return(*(int *)a-*(int *)b);
}
int main()
{
int n=0,i=0,j=0,N=0,point=1000000,d[40]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9},k=0;
cin>>n;
getchar();
for(i=0;i<n;i++)
{
gets(number[i]);
N=strlen(number[i]);
point=1000000;
for(j=0;j<N;j++)
{
if(number[i][j]=='-')
{
continue;
}
if(number[i][j]<='9'&&number[i][j]>='0')
{
numint[i]+=(number[i][j]-'0')*point;
point=point/10;
continue;
}
numint[i]+=d[number[i][j]-'A']*point;
point=point/10;
}
}
qsort(numint,n,sizeof(int),compare);
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
if(numint[i]!=numint[j])
{
if(j-i>1)
{
printf("%03d-%04d %d\n", numint[i]/10000, numint[i]%10000, j-i);
i=j-1;
k=1;
break;
}
else
{
i=j-1;
break;
}
}
}
if(numint[i]==numint[j-1]&&j==n&&i!=j-1)
{
printf("%03d-%04d %d\n", numint[i]/10000, numint[i]%10000, j-i);
k=1;
break;
}
}
if(!k)
{
cout<<"No duplicates."<<endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: