一道acm题目一直Time Limit Exceeded,各位大侠帮帮忙

大侠帮帮忙,我搞了很久,还是不行.
题目如下:
Description:
给出一个字符串S(S仅由’0’~’9’组成,且不包含空格,长度≤100),请将其各个数字按个数打印出,并且输出各个数字之和。

Input:
第一个行整数N为测试数据组数。接下来N行为S
Output:
如果数字i(0≤i≤9)出现的次数大于0则输出i : Ai (Ai为i出现的次数),并在末尾输出S中各个数字的和,每组输出结束后空一行。
Sample Input:
2
0012
13588
Sample Output:
0:2
1:1
2:1
3

1:1
3:1
5:1
8:2
25

#include <stdio.h>
int main ()
{
int n;
while (scanf("%d",&n)!=EOF)
{
getchar();
while(n--)
{
int b[10]={0};
char d;
int q=0,sum=0;
while(d=getchar())
{
if(d=='\n') break;
int e = d- '0';
b[e]++;
}
for(q=0;q<10;q++)
{
if(b[q]!=0)
{
printf("%d:%d\n",q,b[q]);
sum=sum+q*b[q];
}
}
printf("%d\n\n",sum);
}
}
return 0;
}
以上是我的代码.麻烦看一下!!!
我同学用c++语言,跟我差不多的.提交成功了,代码如下:
#include<iostream>
#include<string>
using namespace std;

int main()
{
int N;
while(cin>>N)
{
getchar();
while(N--)
{
int num[10] = {0};
int sum = 0;
while(cin.peek()!='\n')
{
int e = getchar() - '0';
num[e]++;
}
for(int i = 0; i <= 9; i++)
{
if(num[i] != 0)
{
cout<<i<<":"<<num[i]<<endl;
sum += i*num[i];
}
}
cout<<sum<<endl<<endl;
getchar();
}
}
return 0;
}

第1个回答  2009-08-31
你程序的输入有问题,看不懂你是想要怎么去读。。
一个简单点的办法:

char str[101];
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",str);
。。。 //对str的处理和之后的代码
}

补充:首先 读第一个数 是只读一遍的,不用写在循环条件里面
然后 getchar()是会把空格回车全部读进去的 使用scanf读字符串要好的多
第2个回答  2009-08-31
没问题啊,我在OJ上试了一下没问题啊。
第3个回答  2009-09-04
修改过的代码已发给你了..AC了本回答被提问者采纳
相似回答