原题链接:数字整除
解题思路:
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分
29 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复