| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1208 人关注过本帖
标题:这么好的一道题,叫我给搞成这样了TT
只看楼主 加入收藏
see235959850
Rank: 2
等 级:论坛游民
帖 子:380
专家分:29
注 册:2016-12-21
结帖率:100%
收藏
 问题点数:0 回复次数:10 
这么好的一道题,叫我给搞成这样了TT
程序代码:
void change_num(int *a[], int *b[], int m, int n)
{
    int i = 0, j = m - n;
    while (i < n)
        *b[i++] = *a[j++];
    j = 0;
    while (j < m - n)
        *b[i++] = *a[j++];
}

#include<stdio.h>
int main()
{
    void change_num(int *a[], int *b[], int m, int n);
    int a[10], b[10];
    int i;
    int *x[10], *y[10];
    for (i = 0; i < 10; i++)
    {
        x[i] = &a[i];
        y[i] = &b[i];
    }
    for (i = 0; i < 10; i++)
        scanf_s("%d", x[i]);
    change_num(x, y, 10, 3);
    for (i = 0; i < 10; i++)
        printf("%d%c", *y[i], i < 9 ? ' ' : '\n');
    return 0;
}

2017-01-17 11:10
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
题目呢~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-17 11:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
以下是引用九转星河在2017-1-17 11:38:46的发言:

题目呢~

别人不肯说,就不要勉强
将他的垃圾代码改了改
程序代码:
#include <stdio.h>

void change_num( const int a[], int b[], size_t m, size_t n )
{
    for( size_t i=0; i!=n; ++i )
        b[i] = a[m-n+i];

    for( size_t i=n; i!=m; ++i )
        b[i] = a[i-n];
}

int main( void )
{
    int a[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    int b[10];

    change_num( a, b, 10, 3 );

    for( size_t i=0; i!=10; ++i )
        printf( "%d%c", b[i], " \n"[i+1==10] );

    return 0;
}
输出 7 8 9 0 1 2 3 4 5 6
怀疑是 数组循环移位
但 数组循环移位 算法,肯定是不允许另开数组的,否则还有个屁的算法可考呀。
2017-01-17 12:45
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
程序代码:
/*
程序是把数组元素从左向右地挪(位移)n个位置,数据的排列顺序不变。如:n=1;
in:1234567890 => out:0123456789 

我想用1个数组来做才是最优的,看有否有人出来公布了。

*/

void change_num(int *a[], int *b[], int m, int n)
{
    //原来这里的n是控制位移量,m是数组长度
    int i = 0, j = m - n;    
    while (i < n)    //这里假如n是3,那j=m-n;是求出从尾向前移动3个位置,也就下标7
        *b[i++] = *a[j++];    //b记录新数据,a为原数据,分别b[0]=a[7],b[1]=a[8],b[2]=a[9].
    j = 0;    //然后初始a的下标为0
    while (j < m - n)    //继续从之前的i开始,把a[j]余下的数据补上
        *b[i++] = *a[j++];
}

#include<stdio.h>
int main()
{
    void change_num(int *a[], int *b[], int m, int n);    //声明内部函数
    int a[10], b[10];    //声明 2个int数组,a ,b 
    int i;
    int *x[10], *y[10];    //声明 int指针类型 的 数组
    for (i = 0; i < 10; i++)
    {
        x[i] = &a[i];    //问题来了 ,这里是把a个元素的地址赋给了对应元素下标的x
        y[i] = &b[i];    //同上,此时可理解a数组放的数据,而x数组放的是数据的指针
    }
    for (i = 0; i < 10; i++)
        scanf("%d", x[i]);    //这个scanf_s有何好处麻烦指教一下,本人只会用scanf
    change_num(x, y, 10, 3);    //调函数
    for (i = 0; i < 10; i++)    //函数处理后输出
        printf("%d%c", *y[i], i < 9 ? ' ' : '\n');
    return 0;
}
2017-01-17 14:40
绿意盎然
Rank: 2
来 自:湖北
等 级:论坛游民
帖 子:47
专家分:60
注 册:2017-1-5
收藏
得分:0 
2017-01-17 14:55
see235959850
Rank: 2
等 级:论坛游民
帖 子:380
专家分:29
注 册:2016-12-21
收藏
得分:0 
改进版
程序代码:
void sort_num(int *p1, int *p2, int m, int n)
{
    int i = 0, j = m - n;
    while (i < n)
        p2[i++] = p1[j++];
    j = 0;
    while (j < m - n)
        p2[i++] = p1[j++];
}

#include<stdio.h>
int main()
{
    void sort_num(int *p1, int *p2, int m, int n);
    int a[10], b[10];
    int *x1, *x2;
    int i;
    x1 = a;
    x2 = b;
    for (i = 0; i < 10; i++)
        scanf_s("%d", x1 + i);
    sort_num(x1, x2, 10, 3);
    for (i = 0; i < 10; i++, x2++)
        printf("%d%c", *x2, i < 9 ? ' ' : '\n');
    return 0;
}
2017-01-17 17:28
see235959850
Rank: 2
等 级:论坛游民
帖 子:380
专家分:29
注 册:2016-12-21
收藏
得分:0 
继续改进
程序代码:
void sort_num(int *p1, int *p2, int m, int n)
{
    int i, j;
    for (i = 0, j = m - n; i < n; i++, j++)
        p2[i] = p1[j];
    for (j = 0; j < m - n; i++, j++)
        p2[i] = p1[j];
}

#include<stdio.h>
int main()
{
    void sort_num(int *p1, int *p2, int m, int n);
    int a[10], b[10];
    int *x1, *x2;
    int i;
    x1 = a;
    x2 = b;
    for (i = 0; i < 10; i++)
        scanf_s("%d", x1 + i);
    sort_num(x1, x2, 10, 3);
    for (i = 0; i < 10; i++, x2++)
        printf("%d%c", *x2, i < 9 ? ' ' : '\n');
    return 0;
}
2017-01-17 20:14
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
#include<stdio.h>
#include<string.h>

void sort_num(int *p1, int *p2, int m, int n)
{
    memmove(p2, p1+m-n, n*sizeof(int));
    memmove(p2+n, p1, (m-n)*sizeof(int));
}

int main()
{
    int a[10], b[10];
    int *x1, *x2;
    int i;
    x1 = a;
    x2 = b;
    for (i = 0; i < 10; i++)
        scanf_s("%d", x1 + i);
    sort_num(x1, x2, 10, 3);
    for (i = 0; i < 10; i++, x2++)
        printf("%d%c", *x2, i < 9 ? ' ' : '\n');
    return 0;
}
2017-01-17 20:48
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
程序代码:

#include <stdio.h>

#define LEN 10

void move(int *a , int n);
void list(int *a);

int main(int argc, char **argv)
{
    int a[LEN] = {0};
    int i = 0;
    int n = 0;
    
    //输入源数据
    for (i = 0 ; i < LEN ; i++){
        printf("input %d data : ",i);
        scanf("%d",&a[i]);
    }
    
    //输入左位移量
    printf("data right move n : ");
    scanf("%d",&n);
    
    //源数组打印
    printf("one :\n");
    list(a);
    
    //运行位移函数
    move(a,n);
    
    //结果数组打印
    printf("two :\n");
    list(a);
    
    return 0;
}

void move(int *a , int n){
    int swp = 0 , i = 0 , j = 0;    //swp暂时交换储存,i为遍历数组,j为位移次数
    for (j = 1 ; j <= n ; j++){    //位移n次,每次位移1个位置
        for (i = LEN-1 ; i >= 1; i--){    //实行单次位移
            swp = a[(i)%LEN];    //其实就是冒泡法,把最后面的那个数一步步往前的数交换
            a[(i)%LEN] = a[(i-1)%LEN];
            a[(i-1)%LEN] = swp;
//            list(a);    //测试用,每次操作的情况
        }
//        printf("\n");    //测试用,每次冒泡的分割
    }
}

//负责打印输出
void list(int *a){
    int i;
    for (i = 0;i < LEN;i++){
        printf("%3d",a[i]);
    }
    printf("\n");
}



我也来凑热闹,用一个数组来实现。
2017-01-17 22:33
kin3z
Rank: 5Rank: 5
等 级:职业侠客
威 望:4
帖 子:157
专家分:390
注 册:2011-4-24
收藏
得分:0 
以下是引用吹水佬在2017-1-17 20:48:01的发言:

void sort_num(int *p1, int *p2, int m, int n)
{
    memmove(p2, p1+m-n, n*sizeof(int));
    memmove(p2+n, p1, (m-n)*sizeof(int));
}


这里的memmove函数学习了。
请问有不引用公共函数的版本吗?或这个memmove函数的实现原理呢?
2017-01-18 09:52
快速回复:这么好的一道题,叫我给搞成这样了TT
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.124042 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved