解题思路:
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)是否会发生错误???
有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便a[0]==0,也不影响最后累加的 值是否被17整除。但是如果执行对齐这个操作,len的值会减1,比如在执行duiqi(&a[0],len-1)后,他的有效位 数实际减一变为len-2了,这样再执行panduan(a,len-1)是否会发生错误???
有一个地方我不是很明白,就是对齐这个部分。首先不对齐肯定是能做的,即便a[0]==0,也不影响最后累加的值是否被17整除。但是如果执行对齐这个操作,len的值会减1,比如在执行duiqi(&a[0],len-1)后,他的有效位数实际减一变为len-2了,这样再执行panduan(a,len-1)是否会发生错误???
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题6.10 (C语言代码)浏览:588 |
C语言训练-列出最简真分数序列* (C语言代码)浏览:659 |
文科生的悲哀 (C语言代码)浏览:1552 |
矩形面积交 (C++代码)浏览:1206 |
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:729 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:724 |
2005年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:636 |
输出九九乘法表 (C语言代码)浏览:1172 |
明明的随机数 (C语言代码)浏览:966 |
Manchester 2018-04-10 22:38:44 |
对,我试了一下,没有对齐也对,那么就是测试数据里面的数减去个位数5倍后没有使的高位为0的情况,
小小病魔 2018-04-11 12:46:08 |
有可能有高位为0的情况,比如100001减去5为09995.但是这样高位为0不影响计算。