Manchester


私信TA

用户名:wenyajie

访问量:333735

签 名:

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

等  级
排  名 1
经  验 65810
参赛次数 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 人评分

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

  评论区

#include<stdio.h>
int main()
{
    long long int n;
    int count = 0;
    scanf("%lld", &n);
    while(count < 10 && n >= 1)
    {
        if(n == 0) break;
        long long int a = 0;
        a = (n / 10) - 5 * (n % 10);
        if(a % 17 == 0)
        {
            printf("1\n");
        }
        else printf("0\n");
         
        scanf("%lld", &n);
        count ++;
    }
    return 0;
}
谁帮我看看我的程序为什么只能得50分?
2024-05-09 23:00:26
#include<stdio.h>
int main() {
	int a[11];
	int i,t;
	t=1;
	for(i=0; t!=0; i++) {
		scanf("%d",&a[i]);
		t=a[i];
	}
	for(int j=0;j<i-1;j++)
	{
		int n,m,s;
		s=a[j]%10;		//个位数的大小 
		m=(a[j]-s)/10;	//去掉个位数的数值 
		n=m-s*5;		//相减的结果 
		if(n%17==0)
		printf("1\n");
		else
		printf("0\n");
	}
	return 0;
}
为什么我的%50错误啊?求解
2022-01-21 20:13:14
#include "stdio.h"
int pang_duan(int n)
{
    int a;
    a = n%10;
    if((n/10 - 5*a)%17 == 0)return 1;
    else return 0;
}
void main()
{
    int n,k,j = 0;
    long int a[10];
    while(~(k = scanf("%d",&n)))
    {
        if(k != -1)j++;
        if(n == 0)break;
        if(j > 10)
        {
            break;
        }
        a[j-1] = pang_duan(n);
    }
    for(int i = 0;i <= j-2;i++)
    {
        printf("%d\n",a[i]);
    }
}大佬请帮我看看,我这为什么错误50
2022-01-17 21:26:48
#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    char num[10][100],p[2]="";
    unsigned char len,i,j;

    for(i=0;i<10;i++)
    {
        scanf("%s",num+i);
        if(*num[i]==0x30)
            break;
    }

    i==11?i=10:0;

    for(j=0;j<i;j++)
    {
        len=strlen(num[j]);
        len--;
        p[0]=*(num[j]+len);
        *(num[j]+len)=0;
        if((_atoi64(num[j])-_atoi64(p)*5)%17==0)
            puts("1");
        else
            puts("0");
    }

    return 0;
}
为什么会编译出错啊,我自己vscode用的好好的
2021-12-24 20:19:59
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