注册 登录
编程论坛 C++教室

[求助]一个不会做的题目

cpluslover 发布于 2007-04-17 12:23, 1115 次点击
现在有一个数组,里面存放的都是整数

现在对每个数的各个位数加起来的和从小到大排列
然后再把排列后的顺序按原数组值输出

比如a[]={46,22,15}
输出的是:22 15 46


我想了一个方法,但感觉效率不好,有没有更简洁的方法呢

大家一起讨论下吧
18 回复
#2
I喜欢c2007-04-17 12:48
都是两位数吗?

把你写的发上来看看塞....

sum=n%10+n/10;
#3
aipb20072007-04-17 12:51
数组里存的是几位数有规定吗?不规定个最大几位数的话就不好操作!
#4
cpluslover2007-04-17 13:03

可以定为 int

我的思路是又设了个a数组,把各位数的和放到这个新数组1中

然后对新数组1序放到另一个数年数组2中
对数组2各元素查找它在数组1中的位置i,然后打出来a[i]

就这样,三个数组太麻烦了
有没有简单点的呢

#5
aipb20072007-04-17 13:26
只要把数组中每个元素用ele%10 + ele/10 + ……这样计算出来各位和

在用排序排出来就是,随便用什么冒泡,插入的都可以。
#6
cpluslover2007-04-17 13:28
你写一个出来看看,看跟我的方法一样不
#7
aipb20072007-04-17 13:33
要上课了,回来写吧,关键是几位的整数???
#8
cpluslover2007-04-17 13:45

你自己设定就行了,

反正不overflow就行了

两位,一位,三位都可以呵呵

#9
游乐园2007-04-17 15:15

用STL的 map做快些 按照关键字(各位数加起来后的和)进行排序

程序代码:

#include<map>
#include<iostream>


using namespace std;


class Compare {//用来对关键字进行排序
public:


    bool operator()( int key1, int key2 ) const {
  return key1<=key2?1:0;
    }
  };


int sum(int n)//计算各位之和
{
int sum=0;
while(n)
{
  sum+=n%10;
  n/=10;
}
return sum;
}


int main()
{
   int a[6]={123,45,67,2222,96,9};//给定的数组
   copy(a,a+6,ostream_iterator<int>(cout,\" \")); //输出最初的数组
   map<int,int,Compare> s;
   for(int i=0;i<6;++i) s[sum(a[i])]=a[i]; //按照关键字排序赋值
   cout<<\"\nAfter Sorted:\n\";
   for( map<int,int,Compare>::iterator iter = s.begin(); iter != s.end(); iter++ )  cout <<(*iter).second<<\" \";//输出\"排序\"后的数组
   cout<<endl;


   return 0;
}

[此贴子已经被作者于2007-4-17 15:16:43编辑过]

#10
aipb20072007-04-17 16:25

上课回来了,这是我的方法。两个函数:
[CODE]int convert(int ival){
return ival % 10 + ival / 10;
}
void sort(int A[],int size){
for (int i = 1;i < size;++i){
if (convert(A[i]) < convert(A[i-1])){
int temp = A[i],j = i;
do{
A[j] = A[j-1];
--j;
}
while (j > 0 && convert(temp) < convert(A[j-1]));
A[j] = temp;
}
}
}

///////////////////////////////////////////////
///////////////////下面是测试//////////////////
int main(){
const int size = 8;
int list[size] = {12,99,81,46,33,10,66,77};
sort(list,size);
for (int i = 0;i < size;++i)
cout << list[i] << " ";
cout << endl;
return 0;
}[/CODE]

#11
游乐园2007-04-17 18:39

呵呵 思想都是按照关键字(各位求和)再排序 你的很好

只是我在传递数组时排的序,时间上稍微快点 但我完全用了标准库的东东,没什么算法可言

#12
cpluslover2007-04-17 19:44

#include<stdlib.h>
#include<iostream>
using namespace std;

int cmp ( const void *a , const void *b )
{
return *(int *)a - *(int *)b;
}

int convert(int tem)
{
int sum=0;
while(tem)
{
sum=sum+tem%10;
tem=tem/10;

}
return sum;
}

int main()
{

int num[3]={ 193, 392, 24};
int b[3]={0};
int c[3]={0};
int i,j;

for(i=0;i<3;i++)
cout<<num[i]<<" ";
cout<<endl;

for(i=0;i<3;i++)
{
b[i]=convert(num[i]);
c[i]=convert(num[i]);
}


qsort(c,3,sizeof(c[0]),cmp);

for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(b[j]==c[i]) cout<<num[j]<<" ";
}


return 0;
}

#13
cpluslover2007-04-17 19:47

谢谢各位了,上面就是我写的那个笨重算法
呵呵

楼上的那个看不明白,不知道那个调用


楼上上的那个还挺简洁的,有一点不妥就是不支持多2位数的,我写那个太笨重了

#14
aipb20072007-04-17 19:50
我的那个用游大哥那种计算数位和的办法就可以计算任意位了,我也学习了啊!
#15
cpluslover2007-04-17 20:00
恩都不错,

奖励奖励
#16
sunkaidong2007-04-20 11:25
以下是引用aipb2007在2007-4-17 16:25:45的发言:

上课回来了,这是我的方法。两个函数:
[CODE]int convert(int ival){
return ival % 10 + ival / 10;
}
void sort(int A[],int size){
for (int i = 1;i < size;++i){
if (convert(A[i]) < convert(A[i-1])){
int temp = A[i],j = i;
do{
A[j] = A[j-1];
--j;
}
while (j > 0 && convert(temp) < convert(A[j-1]));
A[j] = temp;
}
}
}

///////////////////////////////////////////////
///////////////////下面是测试//////////////////
int main(){
const int size = 8;
int list[size] = {12,99,81,46,33,10,66,77};
sort(list,size);
for (int i = 0;i < size;++i)
cout << list[i] << " ";
cout << endl;
return 0;
}[/CODE]


这位大哥的比较简洁,呵呵.给俺指明方向了啊.

#17
suntaoathome2007-04-21 13:17
#include<iostream.h>
int fun(int num)
{
int result=0;
while(num/10>0||num%10>0)
{
result=result+num%10;
num=num/10;
}
return result;
}
void main()
{
int a[100];
int n=1;
int num;
while(1)
{
cout<<"请输入第"<<n<<"个数据"<<endl;
cout<<"输入 0000 结束输入操作!"<<endl;
cin>>num;
if(num==0000)
break;
a[n-1]=num;
n++;
}
int i,j;
for(i=0;i<n-1;i++)
for(j=i;j<n-2;j++)
if(fun(a[j])>fun(a[j+1]))
{
int temp;
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
for(int h=0;h<n-1;h++)
cout<<a[h]<<endl;
}
#18
边城路人2007-04-21 13:28
楼上的方法真不错
#19
wood13142007-04-21 14:26
只是两位数的话那很好办 sum=n/10+n%10,
要是n位树的话就用个选择分枝结构吧 比如if(10=<n<100)..f(1) else if(100<=n<1000) ...f(2) else if.... else
我想最多不应该超过 65535吧 ! sum=n/(数的数量级)+(n-(n/(数的数量级)x该数量级)+n-(....递归啦(结束条件(数量级到2))) .....最后一个用上级递归过来的结果%10 ) 每算一个数 ,加完和之后 ,连同此数的地址(在数组中的)存在一个与原来等长的新数组中.
然后用快速排对新数组排序, 遍历此数组中的存的地址号,对应打印出原来数组中元素就好.


呵呵 说起来简单 做起来麻烦,(新的数组每个存贮单元都要多出点位置来存原数组的地址号哦.可用结构体 或者把数组申请比原来大1倍也可.记得检查申请空间成功了没有啊)
1