C高手进!!!
http://poj.org/problem?id=1002&lang=zh-CN&change=true
这道题
我的代码- -
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
#include <iostream>
using namespace std;
int map[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9};
int a[10000][7];
char s[10000][100];
int main()
{
long b[100000];
int i,t,j;
while(scanf("%d",&t)!=EOF){
memset(b,0,sizeof(b));
int temp;
int sum=0;
for( i=0;i<t;i++)
{
scanf("%s",s[i]);
}
for(i=0;i<t;i++)
{
for(j=0;s[i][j]!='\0';j++)
{
if(s[i][j]=='-')
continue;
else if(s[i][j]-'A'>=0)
a[i][j]=map[s[i][j]-'A'];
else a[i][j]=s[i][j]-'0';
}
}
for(i=0;i<=6;i++)
{
for(j=0;j<=6;j++)
{
b[i] += (long)pow(10.0,6-j) * a[i][j];
}
}
for(i=0;i<t-1;i++)
{
for(j=i+1;j<t;j++)
{
if(b[i]>b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
for(i=0;i<t;i++)
{
if(b[i]==b[i+1])
{
sum++;
}
else
{
printf("%03d-%04d %d\n",b[i-1]/10000,b[i-1]%10000,sum);
sum=0;
}
}
}
system("PAUSE");
return 0;
}
补充:补充一下 希望高手们按照我的想法做下去。。我想知道我哪里错了。。。谢谢
追问:同上。。你这个也过不了谢谢。。。大哥你这能通过吗。。。
答案:long b[100000];类似于这类大数组很容易造成栈溢出而编译失败。即使调整栈上限也是对空间的极大浪费。建议动态分配内存。电话号码虽然是数字,但是似乎作为字符串处理比较方便。程序仅供参考。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void) {
char map[]="22233344455566670778889990";
long n; // sum of tel
int i,j,count; // count duplicates
char (*tel)[8],ch;
scanf("%ld",&n);
tel = (char (*)[8])malloc(n*sizeof(char [8]));
if (!tel) exit(1); // overflow
ch = getchar(); // eliminate line break '\n'
for (i=0; i<n; i++) {
j = 0;
while ((ch=getchar()) != EOF) {
if (ch=='-') continue; // ignore '-' chars
if (j<7) {
if (ch>='a' && ch<='z')
ch = map[ch-'a']; // convert to num
else if (ch>='A' && ch<='Z')
ch = map[ch-'A'];
tel[i][j++] = ch;
}
else if (j==7)
tel[i][j++] = '\0';
if (ch=='\n') break; // fflush(stdin)
}
}
for (i=0; i<n; i++) { // ascending sort
int min=i;
char tmp[8];
for (j=i+1; j<n; j++)
if (strcmp(tel[min],tel[j])>0)
min = j;
if (min!=i) {
strcpy(tmp, tel[i]);
strcpy(tel[i], tel[min]);
strcpy(tel[min], tmp);
}
}
count = 1;
for (i=0; i<n-1; i++) {
int m=0;
if (strcmp(tel[i],tel[i+1])) {
if (count>1) {
for (j=0; j<7; j++) {
putchar(tel[i][j]);
if (j==2) putchar('-');
}
printf(" %d\n",count);
count = 1;
}
else
m++;
}
else
count++;
if (m==n-1) puts("No duplicates.");
}
if (count>1) {
for (j=0; j<7; j++) {
putchar(tel[i][j]);
if (j==2) putchar('-');
}
printf(" %d\n",count);
}
free(tel); tel = NULL;
return 0;
}
其他:你还是表达一下你的想法吧。。。给别人直接看没注释的代码很痛苦的。。 #include <stdio.h>
#include <stdlib.h>
#include<math.h>
//#include <iostream>
//using namespace std;
int map[]= {2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9};
int a[10000][7];
char s[10000][100];
int main()
{
long b[100000];
int i,t,j;
while(scanf("%d",&t)!=EOF)
{
memset(b,0,sizeof(b));
int temp;
int sum=0;
for( i=0; i<t; i++)
{
scanf("%s",s[i]);
}
for(i=0; i<t; i++)
{
int k=0;//
for(j=0; s[i][j]!='\0'; j++)
{
if(s[i][j]=='-')//j+k不+
continue;
else if(s[i][j]-'A'>=0)
a[i][k++]=map[s[i][j]-'A'];//
else a[i][k++]=s[i][j]-'0';//
}
}
for(i=0; i<t; i++)//…………
{
for(j=0; j<=6; j++)
{
b[i] += (long)pow(10.0,6-j) * a[i][j];
}
}
for(i=0; i<t-1; i++)
{
for(j=i+1; j<t; j++)
{
if(b[i]>b[j])
{
temp=b[i];
b[i]=b[j];
b[j]=temp;
}
}
}
for(i=0; i<t; i++)
{
if(b[i]==b[i+1])
{
sum++;
}
else if(i>0?b[i-1]==b[i]:0)continue;//避免重复输出
else
{
printf("%03d-%04d %d\n",b[i-1]/10000,b[i-1]%10000,sum+1);//
sum=0;
}
}
}
system("PAUSE");
return 0;
}
上一个:c/c++语言实现组合
下一个:C语言编程题,要在Turbo C上运行,加注释行,谢谢!