解题思路:
定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。
例如:
2098765413
第一次去掉个位数3,也就是前面的209876541,需要减去3*5=15,即加上-15
1-15=-14
40-14=26
也就是说,现在需要判断209876526是否是17的倍数
重复上述操作,去掉个位数6 ,也就是前面的20987652,需要减去6*5=30,即加上-30
2-30=-28
50-28=22
也就是说,现在需要判断20987622是否是17的倍数
重复上述操作,去掉个位数2 ,也就是前面的2098762,需要减去2*5=10,即加上-10
2-10=-8
60-8=52
也就是说,现在需要判断2098752是否是17的倍数
重复上述操作,去掉个位数2 ,也就是前面的209875,需要减去2*5=10,即加上-10
5-10=-5
70-5=65
也就是说,现在需要判断209865是否是17的倍数
重复上述操作,去掉个位数5 ,也就是前面的20986,需要减去5*5=25,即加上-25
6-25=-19
80-19=61
也就是说,现在需要判断20961是否是17的倍数
重复上述操作,去掉个位数1 ,也就是前面的2096,需要减去1*5=5,即加上-5
6-5=1
也就是说,现在需要判断2091是否是17的倍数
重复上述操作,去掉个位数1 ,也就是前面的209,需要减去1*5=5,即加上-5
9-5=4
也就是说,现在需要判断204是否是17的倍数
重复上述操作,去掉个位数4 ,也就是前面的20,需要减去4*5=20,即加上-20
0-20=-20
20-20=0
也就是说,现在需要判断0是否是17的倍数
注意事项:
参考代码:
#include <stdio.h> #include <string.h>//strlen函数的头文件 #include <math.h>//pow函数的头文件 int main(){ char number[102]; gets(number); while(number[0] != '0'){ int weishu = strlen(number);//保存大整数的位数 int diff = 0;//保存差值 int tim = 1;//保存减去的个位数的个数 int j = weishu - 2;//保存在大整数字符串中,未被提取的下标 diff = -(number[weishu - 1] - '0') * 5;//减去个位数的5倍 while(j >= 0){ while(diff <= 0 & j >= 0){//从低位开始,一位一位的提取,按相应的权值加到diff差值中,直至diff差值大于0 diff += (number[j]-'0') * pow(10, weishu - 1 - j - tim); j--; } while(diff > 0){//将diff差值重复下述操作,直至diff小于等于0:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍 tim++; int single = diff % 10; diff = diff / 10 - single * 5; } } diff % 17 == 0? printf("1\n"):printf("0\n"); gets(number); } }
0.0分
0 人评分
A+B for Input-Output Practice (IV) (C++代码)浏览:713 |
母牛的故事 (C语言代码)浏览:1451 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:569 |
杨辉三角 (C语言代码)浏览:734 |
1415题求解浏览:681 |
C语言训练-自守数问题 (C语言代码)浏览:702 |
开心的金明 (C语言代码)浏览:564 |
数字统计 (C语言代码)浏览:1118 |
C语言训练-"水仙花数"问题1 (C语言代码)浏览:781 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:1047 |