Manchester


私信TA

用户名:wenyajie

访问量:333795

签 名:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

等  级
排  名 1
经  验 65834
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Xiamen University
专  业 计算机科学

  自我简介:

在历史前进的逻辑中前进,这个逻辑就是人心向背的逻辑

解题思路:
1):按照定理,也就是一个数去掉个位,再减去个位的五倍(判断数)要是17的倍数的话,那原数就是17的倍数,那么减去各位五倍的那个数要是17的倍数的话,还用定理,去掉个位,减去个位的五倍.....这样递归下去,直到到判断数只有三位数的时候,我们用它直接%17看是不是17的倍数,是的话,那么整个原数就是17的倍数;

2):用字符数组记录输入的数;

3):转换为数字存入数组;

4):用另一个数组存放个位数的五倍(只需两位);

5):两数组相减,求判断数,判断数作为新数,(去个位操作:即长度减一)再执行上述操作;

6):因为使用数组存数,相减后,最高位借位后可能为0,把后面的的数一次向前移动,把高位0覆盖;

7):当递归到判断数只有三位数的时,直接%17,判断;


注意事项:
数组的相减,借位,问题,以及高位为0的前移操作;


参考代码:

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

void panduan( int a[], int len );
void jiewei( int *a );
void zhuanhuan( int *a, char *b );
void duiqi( int *a, int *Len );

int    k[10];  /* 用于保存结果*/
int    n = 0;  /* remember  the quantity of consquence */
/*-----------------------------------------------------------------*/
int main()
{
    int    A[1000];
    char    b[1000];
    char    c[] = "0";

    scanf( "%s", b );/*输入数据*/

    while ( strcmp( b, c ) != 0 )
    {
        zhuanhuan( A, b );/*把字符转化为数字*/
        panduan( A, strlen( b ) );/*开始递归排毒安*/

        scanf( "%s", b );
    }

    for ( int i = 0; i < n; i++ )/*输出结果*/
        printf( "%d\n", k[i] );


    return(0);
}

/*-----------------------------------------------------------------*/
void panduan( int a[], int len )
{
    if ( len <= 3 )/*若果输入的数长度小于3*/
    {
        int sum = 0;/*直接判断*/
        for ( int z = 0; z < len; z++ )
        {
            sum = sum * 10 + a[z];
        }

        if ( sum % 17 == 0 )
            k[n] = 1;
        else
            k[n] = 0;

        n++;

        return;
    }


    if ( len > 3 )/*如果长度大于3,则继续递归*/
    {
        int    wubeishu[2]; /*存放个位数的五倍*/
        int    t, i;
        t        = a[len - 1] * 5; /*t为个位数的五倍,len-1为个位数的位置*/
        wubeishu[1]    = t % 10;/*存放个位数的5倍之后的数的个位数字*/
        wubeishu[0]    = t / 10;/*同理存放十位数字*/

        i = len - 2; /*判断数的最后一个数字的位置为len-2,因为之前的数的个位移除*/

        if ( a[i] - wubeishu[1] < 0 ) /*两数相减,先个位数相减,不够减则借位*/
        {
            a[i] = a[i] + 10 - wubeishu[1];
            jiewei( &a[i - 1] );
        }else     { a[i] = a[i] - wubeishu[1]; }

        if ( a[i - 1] - wubeishu[0] < 0 ) /*两个数十位相减,不够则借位*/
        {
            a[i - 1] = a[i - 1] + 10 - wubeishu[0];
            jiewei( &a[i - 2] );
        }else     { a[i - 1] = a[i - 1] - wubeishu[0]; }

        len = len - 1; /*除去个位后的,现在判断数长度*/
        duiqi( &a[0], &len );/*高位对其*/

        panduan( a, len );/*递归判断*/
    }


    return;
}

/*-----------------------------------------------------------------*/
void duiqi( int *a, int *Len )
{
    int len1 = (*Len); /*保存起始长度*/
    while ( (*a) == 0 )
    {
        len1--;/*有一个高位为0,则长度减去1*/
        for ( int i = 0; i < (*Len); i++ )
        {
            (*a) = *(a + 1);
            a++;
        }
    }
    (*Len) = len1;/*返回高位对其后的长度*/
}

/*-----------------------------------------------------------------*/
void jiewei( int *a )
{
    if ( (*a) - 1 < 0 )
    {
        (*a) = (*a) + 9;
        a--;
        jiewei( a );
    }else  {
        (*a) = (*a) - 1;
    }

    return;
}

/*-----------------------------------------------------------------*/
void zhuanhuan( int *a, char *b )
{    while ( (*b) != '\0' )
    {
        (*a) = (*b) - '0';

        a++;
        b++;
    }
    return;
}

别忘点赞哦-.-

 

0.0分

36 人评分

新上线《蓝桥杯辅导》课程,近五年的蓝桥杯省赛与国赛真题都有,从读题开始理解题意、梳理思路、实现代码再提交评测全过程,可有效提升获奖比例甚至进国赛!课程介绍、试听请猛击这里

  评论区

有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便a[0]==0,也不影响最后累加
的值是否被17整除。但是如果执行对齐这个操作,len的值会减1,比如在执行duiqi(&a[0],len-1)后,他的
有效位数实际减一变为len-2了,这样再执行panduan(a,len-1)是否会发生错误???
2018-04-10 16:50:24
有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便a[0]==0,也不影响最后累加的
值是否被17整除。但是如果执行对齐这个操作,len的值会减1,比如在执行duiqi(&a[0],len-1)后,他的有效位
数实际减一变为len-2了,这样再执行panduan(a,len-1)是否会发生错误???
2018-04-10 16:49:17
有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便a[0]==0,也不影响最后累加的值是否被17整除。但是如果执行对齐这个操作,len的值会减1,比如在执行duiqi(&a[0],len-1)后,他的有效位数实际减一变为len-2了,这样再执行panduan(a,len-1)是否会发生错误???
2018-04-10 16:48:34