Easy Problem 2 奇妙的数字

原文地址:https://my.oschina.net/meiguizhinian/blog/873703

Description

有一种自然数,它的各位数字之和能被17整除。这个数的后继数(即这个数加1)的各位数字之和也能被17整除。求所有自然数中,从小到大第n个这样的数。

The Input

你的程序需要从标准输入设备(通常为键盘)中读入多组测试数据。每组输入数据占一行,其中仅有一个整数n(1≤n≤10)。在行首和行尾没有多余的空格。所有数据前后没有多余的空行,两组数据之间也没有多余的空行。

The Output

对每组测试数据,你的程序需要向标准输出设备(通常为启动该程序的终端)依次输出一组对应的答案。每组答案占一行,每行中仅有一个整数,即题问描述中的第n个数。在行首和行尾不要输出多余的空格。在所有数据的前后,以及两组数据之间不要输出多余的空行。

Sample Input

1
3

 

Sample Output

8899
17899

解题思路

    因为各位数字之和能被17整除,所以这数字各位之和是17的整数倍,所以最小值是89。

    因为各位数字之和+1后能被17整除,那么+1的时候必然发生了进位,所以个位数字一定是9。

    如果只发生1次进位,那么这个数字各位和+1前后的差值是8,那么必然有一个数字不能被17整除,所以十位数字也必然是9,不符合。

    如果发生了2次进位,那么这个数字各位和+1前后的差值是17,如果一个数可以被17整除,那么+1后必然可以被17整除。

    如果发生了3次进位,那么这个数字各位和+1前后的差值是26,不符合。

    如果发生了4次进位,那么这个数字各位和+1前后的差值是35,不符合。

    ...

    如果发生了n次进位,那么这个数字各位和+1前后的差值是9*n-1,这个差值要能被17整除。

    综上得到关系式:9*n-1=17*m。

    根据这个关系式,我们可以找出当n<10的时候,值有n=2符合条件。

    所以十位数字和个位数字都是9,而99不能被17整除,所以这个数至少是3位的,且百位数字不能为9

    十位数字+个位数字=18。

    那么其他位的数字和至少需要34-18=16,那么如果这个数字仅有3位,不达不到要求的。所以这个数字至少4位。

    形如:xa99(a!=9),x表示所有其他位数

    因为这个数字+1后也要能被17整除,所以x+a+1必须是是17的整数倍,那么x+a最小值是16,所以xa的最小值是88。

代码

#include <stdio.h>
int easy02_sum_digit(long num){
	int sum = 0;
	while (num) {
		sum+=num%10;
		num/=10;
	}
	return sum;
}

int main(){
	int k=0;
	int begin = 88;
	int list[10] = {};

	while (k!=10) {
		if ((easy02_sum_digit(begin)+18)%17==0 && easy02_sum_digit(begin+1)%17==0) {
			list[k++] = begin*100+99;
		}
		++begin;
	}
	while (scanf("%d",&k)!=EOF) {
		printf("%d\n",list[k-1]);
	}

	return 0;
}

 

转载于:https://my.oschina.net/meiguizhinian/blog/873703

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值