poj1000-1002
2014-05-11 20:32
204 查看
1000
1002 电话号码的去重和统计
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; } }
相关文章推荐
- poj 1000
- POJ 1002
- POJ 1002
- poj 1002
- poj 1002 487-3279
- Poj/OpenJudge 1000 A+b Problem C/C++/Java
- POJ 1002
- poj 1002
- poj 1002 方便记忆的电话号码 字符串处理+排序
- poj1002
- poj 1000 A+B Problem
- poj 1002 487-3279 AC代码
- POJ 1002 487-3279
- poj 1002
- POJ-1002 487-3279
- POJ水题1002 487-3279
- poj 1002 字符串
- poj 1002-487-3279
- poj 1002 (电话号码)
- poj 1002 487-3279