C++问题。这个题是这样的:输入10个数字,按各个位上的和从小到大排序,如果相同,则按数字从小到大
我写的程序出来结果不对。看不出来是哪里错了,求大神修改一下。我写的程序如下:
#include <stdio.h>
#include <string.h>
int cal(int x)
{
int ans=0;
while(x!=0)
{
ans+=x%10;
x/=10;
}
return ans;
}
int min(int x,int y)
{
if(x<y)
return x;
else return y;
}
int cmp(int i,int j)
{
if(cal(i)<cal(j))
return i;
if(cal(i)>cal(j))
return j;
else
return min(i,j);
}
void main()
{
int str[10];
for(int i=0;i<10;i++)
{
scanf("%d",&str[i]);
}
for(i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{
str[i]=cmp(str[i],str[j+1]);
}
printf("%d ",str[i]);
}
} 展开
你想要的结果是什么
举个例,输入10,9,8,7,6,5,4,3,2,1
你要他输出什么
不知道这个是不是你想要的结果
我想其中一个原因是你没有交换至比如str中第10个元素师最小的,那i=0是会把它赋给str[0],i=1是会把它赋给str[1]........结果是str中所有元素都是同一个值,而且是最小值
解决办法是把两个值交换再输出
还有一个是你整个程序都有些问题,想想当j=9是str[j+1]是str[10],而str数组只有十个元素
还有其他很多问题不一一说了,下面是我改的程序,其他不改,只改main函数,我是非得在你的基础上改,而且一些问题还没改过来,要是重写的话可以写的更好,但没时间给你写了,自己琢磨吧
int str[10];
int temp;
for(int i=0;i<10;i++)
{
scanf("%d",&str[i]);
}
for(i=0;i<9;i++)
{
for(int j=i+1;j<10;j++)
{
temp=str[i];
str[i]=cmp(str[i],str[j]);
if(str[i]!=temp)
str[j]=temp;
}
printf("%d ",str[i]);
}
printf("%d ",str[9]);