C++ 四位数排序问题

问题 O: 四位数排序问题
题目描述

有200个正整数,且每个数均在1000至9999之间。函数ReadDat()读取这200个数存放到数组pt中。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行降序排列,然后取出满足此条件的前10个数依次存入数组sum中,如果后三位的数值相等,则按原先的数值进行升序排列。最后调用函数WriteDat()把sum结果输出。

例:处理前 9012 5099 6012 7025 8088

处理后 5099 8088 7025 6012 9012

C++版:

int main()

{

int
i,pt[200],sum[10];

ReadDat(pt);

jsSort(sum,pt);

WriteDat(sum);

return 0;

}

提交时,不需要提交主程序;

输入

200个1000至9999的四位数;

输出

输出10个排好序的四位数;

样例输入

2066 2088 2008 2099 2000 2101 2002 2103 2104 2105 2106 2107 2108 2109 2110 2111
2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127
9160 9161 9162 9163 9164 9165 9166 9167 9168 9169 9170 9171 9172 9173 9174 9175
9176 9177 9178 9179 9180 9181 9182 9183 9184 9185 9186 9187 9188 9189 9190 9191
9192 9193 9194 9195 9196 9197 9198 9199 9200 9201 9202 9203 9204 9205 9206 9207
3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431
3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447
3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463
3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479
3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 4493 3493 4495 3495
4260 4060 4062 4163 4164 4165 4166 4167 4168 4169 4170 4171 4172 4173 4174 4175
4176 4177 4178 4179 4180 4181 4182 4183 4184 4185 4186 4187 4188 4189 4190 4191
4192 4193 4194 2080 2081 2082 2083 2084

样例输出

3495 4495 3493 4493 3491 3490 3489 3488 3487 3486

看看这个能满足你的要求吗?
//#include "stdafx.h"//vc++6.0加上这一行.
#include <iostream>
#include "time.h"
#include "stdlib.h"
using namespace std;
void ReadDat(int *p,int n=200){
for(int i=0;i<n;*(p+i++)=rand()%9000+1000);
//for(int i=0;i<n;cin >> *(p+i++));//手工输入用这一行,把前一行删除
}
void jsSort(int *p,int *q,int n=200){
for(int i=0;i<n;i++){
for(int a,b,k=i,j=k+1;j<n;j++)
if((a=*(p+k)%1000)<(b=*(p+j)%1000) || a==b && *(p+k)>*(p+j))
k=j;
if(k!=i){
j=*(p+k);
*(p+k)=*(p+i);
*(p+i)=j;
}
if(i<10) *q++=*(p+i);
}
}
void WriteDat(int *p,int n=10){
while(n--){
cout << *p++ << ' ';
}
}
void main(void){
srand((unsigned)time(NULL));
int pt[200],sum[10];
ReadDat(pt,200);
jsSort(pt,sum,200);
WriteDat(sum,10);
cout << endl;
}追问

大神他给好了主程序了,不能改掉他的。麻烦了

追答

你把main中的函数调用中的200、200、10删除不就行了!

追问

追答

void ReadDat(int *p,int n=200){

    srand((unsigned)time(NULL));

    for(int i=0;i<n;*(p+i++)=rand()%9000+1000);

    //for(int i=0;i<n;cin >> *(p+i++));//手工输入用这一行,把前一行删除

}

void jsSort(int *q,int *p,int n=200){

    for(int i=0;i<n;i++){

        for(int a,b,k=i,j=k+1;j<n;j++)

            if((a=*(p+k)%1000)<(b=*(p+j)%1000) || a==b && *(p+k)>*(p+j))

                k=j;

        if(k!=i){

            j=*(p+k);

            *(p+k)=*(p+i);

            *(p+i)=j;

        }

        if(i<10) *q++=*(p+i);

    }

}

void WriteDat(int *p,int n=10){

    while(n--){

        cout << *p++ << ' ';

    }

}

void main(void){

    int pt[200],sum[10];

    ReadDat(pt);

    jsSort(sum,pt);

    WriteDat(sum);

    cout << endl;

}

下面是运行结果,没有你反映的问题。

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-05-28
用%1000取后三位,进行排序,
相同的再按原数排(出了前十的就不用排序了)
如果有疑问,欢迎追问追问

我专业扔很久了,现在看到这个都头疼。
现在是为了应付期末的。我想麻烦大神帮做的。我现在在搞PS,需要PS方面的,你可以找我。

追答

你这数据不大,冒泡排序还记得吗?
(我现在还是初二的……)

追问

好吧。。。那我自己来吧。

追答

你要代码么?我可以帮你打一部分

追问

不用了,我自己来。。。

追答

没关系,我帮你打吧


void jsSort(int *sum,int *pt)
{
    for(int i=0;i<10;i++)
        sum[i]=10000;
    for(int i=0;i<200;i++)
    {
        if(pt[i]%1000>sum[9]%1000||(pt[i]%1000==sum[9]%1000&&pt[i]<sum[9]))
        {
            sum[9]=pt[i];
            for(int j=0;j<9;j++)
                if(pt[i]%1000>sum[j]%1000||(pt[i]%1000==sum[j]%1000&&pt[i]<sum[j]))
                {
                    sum[j+1]=sum[j];
                    sum[j]=pt[i];
                }
        }
    }
}

希望能采纳

如果仍有疑问,欢迎追问或私信我

追问

过不了,编译错误

追答#include<iostream>
using namespace std;
void jsSort(int *sum,int *pt)
{
    for(int i=0;i<10;i++)
        sum[i]=10000;
    for(int i=0;i<200;i++)
    {
        if(pt[i]%1000>sum[9]%1000||(pt[i]%1000==sum[9]%1000&&pt[i]<sum[9]))
        {
            sum[9]=pt[i];
            for(int j=8;j>=0;j--)
                if(pt[i]%1000>sum[j]%1000||(pt[i]%1000==sum[j]%1000&&pt[i]<sum[j]))
                {
                    sum[j+1]=sum[j];
                    sum[j]=pt[i];
                }
        }
    }
}
void ReadDat(int *pt)
{
    for(int i=0;i<200;i++)
        cin>>pt[i];
}
void WriteDat(int *sum)
{
    for(int i=0;i<10;i++)
        cout<<sum[i]<<" ";
}

本回答被提问者采纳

C++ 四位数排序问题
\/\/#include "stdafx.h"\/\/vc++6.0加上这一行.include <iostream> include "time.h"include "stdlib.h"using namespace std;void ReadDat(int *p,int n=200){ for(int i=0;i<n;*(p+i++)=rand()%9000+1000);\/\/for(int i=0;i<n;cin >> *(p+i++));\/\/手工输入用这一行,...

C++中有a[]里面有200个四位数,要求千位大于等于百位,以此类推,找出全部...
cin>>N;cout<<"请输入 "<<N<<" 个测试的四位数: "<<endl;int i=0;for(i=1;i<=N;i++)cin>>num[i];cout<<endl;QuickSort(num,1,N);\/* 对N个数排序 *\/ for(i=1;i<=N;i++){ if(num[i]%2==1){ int a = (num[i]\/1) % 10;\/\/个位数字 int b = (num...

求四位数字全排列
有点不解了,如果不允许数字重复,那就是A(1,9)*A(3,9)=9*9*8*7=4536个数啊 如果允许重复那也不对啊,1000--9999那也才9000个啊

设计一个C++程序,输入一个四位数(整数),将各位数字分开,并按其正序输...
include <iostream> using namespace std;int main(){ int s[5];int i,j,num;cin>>num;for(i=0;num!=0;i++){ s[i]=num%10;num\/=10;} for(j=i-1;j>=0;j--)cout<<s[j]<<" ";cout<<endl;return 0;}

c++编程:设N是一个四位数,它的9倍正好是其反序数,求N。反序数就是将整...
using namespace std;void main(){ int a,b,c,d,m,n;for(a=1;a<=9;a++){ for(b=0;b<=9;b++){ for(c=0;c<=9;c++){ for(d=1;d<=9;d++){ m=9*(1000*a+100*b+10*c+d);n=1000*d+100*c+10*b+a;while(m==n){ cout<<a<<b<<c<<d;break;} } } } }...

c++中输入四个int整数,将其大小顺序输出
if(a<b) i=a;a=b;b=i; 其实等价于:if(a<b)i=a;a=b;b=i;③正确的方法是加上大括号:include <iostream.h> void main(){ int a,b,c,d,i;cout<<"请输入四个整数"<<endl;cin>>a>>b>>c>>d;if(a<b) {i=a;a=b;b=i;} if(a<c) {i=a;a=c;c=i;} if(a<...

验证4位数卡布列克运算C++程序,最好给注解
for(i=0;i<4;i++)num[i]=(int)(number\/pow(10.0,(double)i))%10;paixu(num);number=maxium(num)-minium(num);printf("%d-%d=%d\\n",maxium(num),minium(num),number);\/\/输出每次运算步骤 } } void paixu(int *num)\/\/将四个数从大到小排序 { int i,j,temp;for(i=0;i<4;...

只用C++循环,不用递归,如何让穷举1234这四个数字或者说是字符的排列组合...
include <iostream> using namespace std;main(){ int i,j,k,l,cnt=0;for (i=1;i<=4;i++){ for (j=1;j<=4;j++){ for (k=1;k<=4;k++){ for (l=1;l<=4;l++){ if ( i!=j && i!=k && i!=l && j!=k && j!=l && k!=l ){ cout<<i<<j<<k<<l<<"...

C++ 产生一个四位数的乱数,但四个数字不可以重复,而且第一个不得为...
\/\/确保千位不为0 } \/\/ 求出每一位数字 w1 = n \/ 10; w2 = w1 \/ 10; w3 = w2 \/ 10 % 10; w2 %= 10; w1 %= 10; w0 = n % 10; \/\/反正位数少,拙劣但最直白的方式穷举所有不等的情况 if ( w0 ^ w1 && w0 ^ w2 && w0 ^ w3 && w1 ...

用c++语言编写:输入一个4位数,要求输出反转,比如输入1234,输出4321.请...
int num;int a1,a2,a3,a4;\/\/存储四位数的每一位 cout<<"输入一个4位数:"<<endl;\/\/\/提示输入 cin>>num;\/\/\/以输入1234为例,此时num=1234 a1=num\/1000;\/\/\/求千位,此时a1=1 num-=a1*1000;\/\/\/把千位减掉,便于求百位,此时num=234 a2=num\/100;\/\/求百位,此时a2=2;num-=a2*100;...

相似回答