原题链接:数字整除
解题思路:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复