观察者


私信TA

用户名:dotcpp0770071

访问量:14

签 名:

等  级
排  名 18680
经  验 741
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的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 人评分

  评论区

  • «
  • »