Manchester


私信TA

用户名:wenyajie

访问量:163393

签 名:

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

等  级
排  名 1
经  验 38316
参赛次数 1
文章发表 188
年  龄 0
在职情况 学生
学  校 Qing Dao 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分

19 人评分

  评论区

panduan()递归调用,假设数字字符串很长,每次递归,都重复做一次掐尾,减尾*5,,,最终使得字符长度低于3,再转换成数字求模判断,这样反复的掐尾行为,测试了,居然是可以的,这脑洞。。。。。
2020-03-18 14:44:53 | |
#include<stdio.h>
#include<string.h>
#include<math.h>
int fun(char *str)
{
	char *p = str;
	int a,b,i,c=0;
	while(strlen(str)>=10){
		while(*p)  p++; p--;
		a = (*p-'0')*5 ;
		*p = 0 ;
		 b = 0;
		for(i=0 ; i<2 ; i++){
			p--;
			b += (*p-'0')*pow(10,i);
		}
		b -= a;
		*p = b/10 +'0' ; p++ ; *p= b%10 + '0';
		while((*p-'0')<0){
			*p += 10;
			 p--;
			(*p)--;
		}
	}
	p=str;
	while(*p){
		c = c*10 + (*p-'0');
		p++;
	}
	

	return c;
 }  给大家参考下  
这个函数是把超长整数转换成与一个计算机可以处理的数,这个数是否是17的倍数 与 超长整数一致(利用题目条件)
2019-07-26 10:49:03 | |
#include<stdio.h>
 
int main() {
    int x = 0;
    char ch;
    scanf("%c", &ch);
    do {
        while (ch != '\n') {
            x *= 10;
            x += ch - '0';
            x %= 17;
            scanf("%c", &ch);
        }
        if (x == 0)
            printf("1\n");
        else
            printf("0\n");
        scanf("%c", &ch);
        x = 0;
    } while (ch != '0');
    return 0;
2019-07-26 10:44:53 | |
void jiewei( int *a )
{
    if ( (*a) - 1 < 0 )
    {
        (*a) = (*a) + 9;
        a--;
        jiewei( a );
    }else  {
        (*a) = (*a) - 1;
    }
 
    return;
}  大神可以把这里面的a-- 简单的说明一下吗?引用的地址 向前移动一位吗?
2019-05-27 06:38:48 | |
有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便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 | |
  • «
  • 1
  • »