编程练习2(二)

6、对N行N列二维数组的每一行排序,偶数行(0当作偶数)由小到大排序,奇数行由大到小排序

#include <stdio.h>
#define N 4                                                             //宏定义N为4

void max_first( int *a, int len )                                       //定义max_first函数,将数组由大到小排序
{
    int m = 0;
    int n = 0;
    int temp = 0;

    for( m = 0; m < len; m++ )
    {
        for( n = 0; n < len - 1 - m; n++ )
        {
            if( a[n] <= a[n + 1] )
            {
                temp = a[n];
                a[n] = a[n + 1];
                a[n + 1] = temp;
            }                                                           //利用冒泡排序法对数组中的元素由大到小排序,前面的数小于等于后面的数就交换
        }
    }
}

void min_first( int *a, int len )                                       //定义min_first函数,将数组由小到大排序
{
    int m = 0;
    int n = 0;
    int temp = 0;

    for( m = 0; m < len; m++ )
    {
        for( n = 0; n < len -1 - m; n++ )
        {
            if( a[n] >= a[n + 1] )
            {
                temp = a[n];
                a[n] = a[n + 1];
                a[n + 1] = temp;
            }                                                           //利用冒泡排序法对数组中的元素由小到大排序,前面的数大于等于后面的数就交换
        }
    }
}

int main()
{
    int a[N][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
    int i = 0;
    int j = 0;

    for( i = 0; i < N; i++ )
    {
        if( i % 2 != 0 )
        {
            max_first( a[i], N );                                       //当为奇数行时,调用max_first函数
        }

        else if( i % 2 ==0 )
        {
            min_first( a[i], N );                                       //当为偶数行时,调用min_first函数
        }
    }

    for ( i = 0; i < N; i++ )
    {
        for( j = 0; j < N; j++ )
        {
            printf("%d\t",a[i][j]);
        }
        printf("\n");                                                   //输出转换后的二维数组
    }

    return 0;
}

7、找出符合以下条件的Troitsky数,将该数的首位数字移动到末位数字之后得到的数是原数的整数倍
例如:将142857的首位数字1移动到末位之后得到的数是428571,而428571=3*142857,因此142857是Troitsky数
编程要求:
(1) 编写函数int Troitsky(long a[]),其功能是求出10000以内的所有Troitsky数,并将它们依次放入a指向的数组中,函数返回找到的Troitsky数的个数.
(2)编写main函数,调用Troitsky函数,将运行结果输出到屏幕。

#include <stdio.h>
#define N 10000                                             //宏定义N的值为10000

int Troitsky( long a[] )
{
    int i = 0;
    int j = 0;
    int k = 0;
    int temp = 0;
    int high = 0;
    int result = 0;
    int count = 0;

    for( i = 1; i <= N; i++ )
    {
        temp = i;                                           //将i的值传给temp
        k = 0;                                              //让k清零

        while( temp != 0 )
        {
            temp = temp / 10;
            k++;                                            //求出temp的位数
        }
        temp = i;                                           //重新让temp等于i

        for( j = 0; j < k - 1; j++ )
        {
            temp = temp / 10;                               //求出temp最高位上的数
        }
        high = temp;                                        //求得的值传给high

        for( j = 0; j < k - 1; j++ )
        {
            temp = temp * 10;                               //将最高位的数乘以其位上的单位值
        }
        result = ( i - temp ) * 10 + high;                  //i减去最高位乘以其位上的单位值得到剩下位的数值,乘以10加上最高位上的数值即得到首位数字移到末位数字后的数值

        if( (result >= i) && (result % i == 0) )
        {
            a[count] = i;
            count++;                                        //如果得到的数值大于等于i,并且能整除i,符合条件,放入数组a中,并让count累计有几个符合条件的数
        }
    }
    return count;                                           //返回累计的count值
}

int main()
{
    int i = 0;
    int num = 0;
    long a[N] = {0};

    num = Troitsky(a);                                      //调用Troitsky函数

    printf("the number of Troitsky is :%d\n",num);          //输出累计的符合条件的数的个数

    for( i = 0; i < num; i++ )
    {
        printf("%ld\t",a[i]);                               //输出符合条件的数

        if( (i + 1) % 10 == 0 )
        {
            printf("\n");                                   //用i来控制输出,10个一行
        }
    }
    printf("\n");

    return 0;
}

8、合并两个字符集合为一个新集合,每个字符串在新集合中仅出现一次,函数返回新集合中字符串。
如:
s1集合{“while”,”for”,”switch”,”if”,”continue”}
s2集合{“for”,”case”,”do”,”else”,”char”,”switch”}
运行结果:

#include <stdio.h>
#include <string.h>

int combine( char s1[5][10], char s2[6][10], char result[11][10] )
{
    int i = 0;
    int j = 0;
    int k = 0;
    int flag = 0;

    for( i = 0; i < 5; i++ )
    {
        for( j = 0; j < 10; j++ )
        {
            result[k][j] = s1[i][j];                                //把s1中的字符串传给result
        }
        k++;                                                        //用来累计result中有几个字符串
    }

    for( i = 0; i < 6; i++ )
    {
        flag = 1;
        for( j = 0; j < 5; j++ )
        {
            if( (strcmp(*(s1 + j), *(s2 + i))) == 0 )               //比较s1中有无和这个字符串相同的字符串
            {
                flag = 0;
                break;                                              //有相同字符串让flag=0退出本次循环
            }
        }
        if( flag != 0 )
        {
            for( j = 0; j < 10; j++ )
            {
                result[k][j] = s2[i][j];                            //当flag不为0代表s1中无相同的字符串,可以传给result
            }
            k++;                                                    //累计result中有几个字符串
        }
    }
    return k;                                                       //返回k的值
}

int main()
{
    char s1[5][10] = {"while","for","switch","if","continue"};
    char s2[6][10] = {"for","case","do","else","char","switch"};
    char result[11][10] = {0};
    int i = 0;
    int num = 0;

    num = combine( s1, s2, result );                                //调用combine函数,并让num等于其返回值

    for( i = 0; i < num; i++ )
    {
        printf("%s\t",result[i]);                                   //输出合并后的字符串
    }
    printf("\n");

    return 0;
}

9、找出7个默森尼数。法国数学家默森尼曾提出下列公式:Mp=2^p-1。当p是素数并且Mp也是素数时,称Mp为默森尼数,
例如,p=5,Mp=2^5-1=31,5和31都是素数,因此31是默森尼数;而Mp=2^11-1=2047,11是素数,2047不是素数,因此2047不是默森尼数.

#include <stdio.h>

int prime( int i )                                      //定义判断素数函数
{
    int j = 2;
    for( j = 2; j < i; j++ )
    {
        if( i % j == 0 )
        {
            return 0;
            break;
        }                                               //如果输入的数能整除比它小的数,不是素数,返回0,退出本次循环
    }
    return 1;                                           //不能整除比它小的数,是素数,返回1
}

int main()
{
    int i = 0;
    int j = 0;
    int count = 0;                                      //用count来来累计符合条件的数的个数
    long temp = 1;

    for( i = 2; count < 7; i++ )                        //当count等于7时停止循环
    {
        temp = 1;                                       //让temp等于1
        for( j = 0; j < i; j++ )
        {
            temp = 2 * temp;                            //算出2^i的值
        }
        temp = temp - 1;                                //让temp等于Mp

        if( (prime(i) == 1) && (prime(temp) == 1) )     //当i和temp都是素数时符合条件
        {
            count++;                                    //count+1
            printf("%d\t",temp);                        //输出temp的值
        }
    }
    printf("\n");

    return 0;
}

10、对一个二维数组中的数据排序,方法如下:
将整个数组中值最小的元素所在行调整为数组第一行,
将除第一行外的行中最小元素所在行调整为第2行,
将除第1,2行外的行中最小值元素所在行调整为第3行,以此类推

#include <stdio.h>
#define N 4

int find_min( int a[N][N], int i )                                          //定义find_min函数,作用为找到一行中最小的数,并把最小值放在第一个
{
    int j = 0;
    int temp = 0;
    int min = a[i][0];                                                      //假设第一个数为最小的数

    for( j = 0; j < N; j++ )
    {
        if( min > a[i][j] )
        {
            min = a[i][j];                                                  //如果min大于后面的某个数,让min等于这个数
            temp = a[i][0];
            a[i][0] = a[i][j];
            a[i][j] = temp;                                                 //把这个数和第一个数互换
        }
    }

    return min;                                                             //返回这一行中最小的数
}

int find_minline( int a[N][N], int line )
{
    int i = 0;
    int temp = 0;
    int min = find_min( a, line );                                          //调用find_min函数,找到line这一行最小的数并赋给min
    int minline = line;

    for( i = line + 1; i < N; i++ )
    {
        temp = find_min( a, i );                                            //调用find_min函数,找到i这一行最小的数,并赋给temp
        if( min > temp )
        {
            minline = i;                                                    //比较min和temp,如果min大于temp,表示剩余数中的最小数在i行
            min = temp;                                                     //将temp的值赋给min
        }
    }
    return minline;                                                         //返回剩余数中最小数所在的行数
}

void swap( int a[N][N], int line, int minline )
{
    int i = 0;
    int temp = 0;

    for( i = 0; i < N; i++)
    {
        temp = a[line][i];
        a[line][i] = a[minline][i];
        a[minline][i] = temp;
    }                                                                       //交换line行和minline行中的数
}

void sort( int a[N][N] )
{
    int i = 0;
    int minline = 0;
    for( i = 0; i < N - 1; i++ )
    {
        minline = find_minline( a, i );                                     //调用find_minline行,找到最小数所在的行数,并赋给minline
        if( minline != i )                                                  //如果minline不等于i,交换
        {
            swap( a, i, minline );                                          //调用swap函数,交换i行和minline行中的数
        }
    }
}

int main()
{
    int a[N][N] = {{18,24,53,74},{5,66,37,81},{29,10,41,32},{13,64,85,56}};
    int i = 0;
    int j = 0;

    printf("the original array :\n");
    for( i = 0; i < N; i++)
    {
        for( j = 0; j < N; j++ )
        {
            printf("%d\t",a[i][j]);                                         //输出交换前的二维数组
        }
        printf("\n");
    }

    sort( a );                                                              //调用sort函数,对数组进行转换

    printf("the array after sort:\n");
    for( i = 0; i < N; i++)
    {
        for( j = 0; j < N; j++ )
        {
            printf("%d\t",a[i][j]);                                         //输出交换后的二维数组
        }
        printf("\n");
    }

    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值