当前位置:编程学习 > C/C++ >>

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上运行,加注释行,谢谢!

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,