求助各位大大~杭电1106题我的程序错在哪,如何改...谢谢!
杭电1106:我的程序一:#include<stdio.h>#include<string.h>#include<math.h>longzhuan(chara[]);in...
杭电1106:
我的程序一:
#include <stdio.h>
#include <string.h>
#include <math.h>
long zhuan(char a[]);
int main()
{
char a[100][1001],b[1001],temp[1001];
long i,j;
long line1;
long k,l,h;
while(scanf("%s", b)!=EOF)
{
line1=strlen(b);
k=0;l=0;
for(i=0;i<=line1;i++)
{
if(b[i]!='5')
a[k][l++]=b[i];
else if(b[i]=='5' || i==line1)
{
a[k][l]='\0';
k++;
l=0;
}
}
for(i=0;i<=k;i++)
for(j=0;j<strlen(a[i]);j++)
{
j=0;
if(a[i][j]=='0' && j!=strlen(a[i])-1)
{
for(l=0;l<strlen(a[i]);l++)
a[i][l]=a[i][l+1];
}
else if(a[i][j]=='0' && j==strlen(a[i])-1)
a[i][j]='0';
else if(a[i][j]!='0')
break;
}
for(i=0;i<=k-1;i++)
{
h=i;
for(j=i+1;j<=k;j++)
if(zhuan(a[h])>zhuan(a[j]))
h=j;
if(h!=i)
{
strncpy(temp,a[i],1001);
strncpy(a[i],a[h],1001);
strncpy(a[h],temp,1001);
}
}
for(i=0;i<=k;i++)
{
printf("%s",a[i]);
if(i!=k && a[i][0]!='\0')
printf(" ");
}
printf("\n");
}
return 0;
}
long zhuan(char a[])
{
long line,i;
long x=0,y;
line=strlen(a);
y=line-1;
for(i=0;i<line;i++)
x+=((a[i]-'0')*pow(10,y--));
return x;
}
交上运行错误Runtime Error
我的程序二:就是把程序一的a[100][1001]改成a[100][750],strncpy里1001改750
交上去答案错误Wrong Answer
我认为是第一个程序错是因为二维数组a[100][1001]那个1001太大了,数组越界了,所以运行错误
第二个程序错是因为二维数组a[100][750]那个750太大了,所以答案错误
其他的本地调试都正确了,但是就是不懂怎么改。。。郁闷
请各位大大看看我到底哪里错,然后又将怎么改我的程序才可以做对呢,谢谢了!!!
题目:排序
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9087 Accepted Submission(s): 2030
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
网上查了下有人说是有多行输入,但是题目说“每组输入数据只有一行数字”,还是要到“EOF”才结束?难道是这里也有问题?
反正我觉得不是输入的数组a[100][1000]有问题,就是上面提到的有问题。。。
你好一楼的,我不是没有去想,只是真的是独立想不出来了(我都想了一个星期了),【我不要正确的完整代码】,只要能告诉我我的独立写出的程序那里错就行了,我觉得这样应该可以叫做“跟自己身边的高手学习一下”把,而且我现在从学校回家,家这边我不知道谁会C呀,我只能上网跟自己“身边”的高手学习一下,希望一楼能理解!!!谢谢!! 展开
我的程序一:
#include <stdio.h>
#include <string.h>
#include <math.h>
long zhuan(char a[]);
int main()
{
char a[100][1001],b[1001],temp[1001];
long i,j;
long line1;
long k,l,h;
while(scanf("%s", b)!=EOF)
{
line1=strlen(b);
k=0;l=0;
for(i=0;i<=line1;i++)
{
if(b[i]!='5')
a[k][l++]=b[i];
else if(b[i]=='5' || i==line1)
{
a[k][l]='\0';
k++;
l=0;
}
}
for(i=0;i<=k;i++)
for(j=0;j<strlen(a[i]);j++)
{
j=0;
if(a[i][j]=='0' && j!=strlen(a[i])-1)
{
for(l=0;l<strlen(a[i]);l++)
a[i][l]=a[i][l+1];
}
else if(a[i][j]=='0' && j==strlen(a[i])-1)
a[i][j]='0';
else if(a[i][j]!='0')
break;
}
for(i=0;i<=k-1;i++)
{
h=i;
for(j=i+1;j<=k;j++)
if(zhuan(a[h])>zhuan(a[j]))
h=j;
if(h!=i)
{
strncpy(temp,a[i],1001);
strncpy(a[i],a[h],1001);
strncpy(a[h],temp,1001);
}
}
for(i=0;i<=k;i++)
{
printf("%s",a[i]);
if(i!=k && a[i][0]!='\0')
printf(" ");
}
printf("\n");
}
return 0;
}
long zhuan(char a[])
{
long line,i;
long x=0,y;
line=strlen(a);
y=line-1;
for(i=0;i<line;i++)
x+=((a[i]-'0')*pow(10,y--));
return x;
}
交上运行错误Runtime Error
我的程序二:就是把程序一的a[100][1001]改成a[100][750],strncpy里1001改750
交上去答案错误Wrong Answer
我认为是第一个程序错是因为二维数组a[100][1001]那个1001太大了,数组越界了,所以运行错误
第二个程序错是因为二维数组a[100][750]那个750太大了,所以答案错误
其他的本地调试都正确了,但是就是不懂怎么改。。。郁闷
请各位大大看看我到底哪里错,然后又将怎么改我的程序才可以做对呢,谢谢了!!!
题目:排序
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9087 Accepted Submission(s): 2030
Problem Description
输入一行数字,如果我们把这行数字中的‘5’都看成空格,那么就得到一行用空格分割的若干非负整数(可能有些整数以‘0’开头,这些头部的‘0’应该被忽略掉,除非这个整数就是由若干个‘0’组成的,这时这个整数就是0)。
你的任务是:对这些分割得到的整数,依从小到大的顺序排序输出。
Input
输入包含多组测试用例,每组输入数据只有一行数字(数字之间没有空格),这行数字的长度不大于1000。
输入数据保证:分割得到的非负整数不会大于100000000;输入数据不可能全由‘5’组成。
Output
对于每个测试用例,输出分割得到的整数排序的结果,相邻的两个整数之间用一个空格分开,每组输出占一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
网上查了下有人说是有多行输入,但是题目说“每组输入数据只有一行数字”,还是要到“EOF”才结束?难道是这里也有问题?
反正我觉得不是输入的数组a[100][1000]有问题,就是上面提到的有问题。。。
你好一楼的,我不是没有去想,只是真的是独立想不出来了(我都想了一个星期了),【我不要正确的完整代码】,只要能告诉我我的独立写出的程序那里错就行了,我觉得这样应该可以叫做“跟自己身边的高手学习一下”把,而且我现在从学校回家,家这边我不知道谁会C呀,我只能上网跟自己“身边”的高手学习一下,希望一楼能理解!!!谢谢!! 展开
4个回答
展开全部
排序最好用系统自带的sort(),o(n*n)不好过吧!
刚做了下,给你吧:
#include <iostream>
#include <algorithm>
using namespace std;
int data[1005];
char str[1005];
int main()
{
while(scanf("%s",str)!=EOF)
{
int i=0,j=0,k=0,n=strlen(str);
while(str[k]=='5')k++;
j=k;
while(str[k])
{
while(str[k]!='5'&&str[k]!=0)k++;
str[k++]=0;
data[i++]=atoi(str+j);
while(str[k]=='5')k++;
j=k;
if(k==n)break;
}
sort(data,data+i);
cout<<data[0];
for(j=1;j<i;++j)cout<<" "<<data[j];
cout<<endl;
}
return 0;
}
刚做了下,给你吧:
#include <iostream>
#include <algorithm>
using namespace std;
int data[1005];
char str[1005];
int main()
{
while(scanf("%s",str)!=EOF)
{
int i=0,j=0,k=0,n=strlen(str);
while(str[k]=='5')k++;
j=k;
while(str[k])
{
while(str[k]!='5'&&str[k]!=0)k++;
str[k++]=0;
data[i++]=atoi(str+j);
while(str[k]=='5')k++;
j=k;
if(k==n)break;
}
sort(data,data+i);
cout<<data[0];
for(j=1;j<i;++j)cout<<" "<<data[j];
cout<<endl;
}
return 0;
}
展开全部
嗯.. 看你学习蛮认真的哈.
这个题目 一眼就知道不能转成整型去比较啦, 你怎知是不会超范围?
如果有111111111111111111111111111111111111111这样的数据你怎么搞?
所以正确解法是直接用字符串去比较大小, 这个简单吧?
还有 100*1000的数组只有100k而已, 一般都是给64m空间 不可能超的
这个题目 一眼就知道不能转成整型去比较啦, 你怎知是不会超范围?
如果有111111111111111111111111111111111111111这样的数据你怎么搞?
所以正确解法是直接用字符串去比较大小, 这个简单吧?
还有 100*1000的数组只有100k而已, 一般都是给64m空间 不可能超的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
ACM练习的是独自处理问题的能力,自己学着处理吧,跟自己身边的高手学习一下。给了代码也没有用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
。。。。 用Microsoft Visual C++ 运行没错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询