洛谷 P1151 子数整数

【题目链接】

洛谷 P1151 子数整数

【题目考点】

1. 循环:数位分离
2. 数字组合

【解题思路】

解法1:取出三个三位数字

对于一个五位数字 a 1 a 2 a 3 a 4 a 5 a_1a_2a_3a_4a_5 a1a2a3a4a5
s u b 1 = a 1 a 2 a 3 sub_1=a_1a_2a_3 sub1=a1a2a3,是x的前3位,要取到前3位的方法是:x/100。
s u b 2 = a 2 a 3 a 4 sub_2=a_2a_3a_4 sub2=a2a3a4,是x的中间3位,要取到中间3位的方法是:x/10%1000。
s u b 3 = a 3 a 4 a 5 sub_3=a_3a_4a_5 sub3=a3a4a5,是x的中间3位,要取到最后3位的方法是:x%1000。
枚举10000~30000的每一个数字,通过计算得到该五位数字分解出的 s u b 1 , s u b 2 , s u b 3 sub_1, sub_2, sub_3 sub1,sub2,sub3,判断这三个数字是否都是k的倍数(除以k的余数为0)
设标志位hasOutput,标记是否有输出。
如果 s u b 1 , s u b 2 , s u b 3 sub_1, sub_2, sub_3 sub1,sub2,sub3这三个数字都是k的倍数,则输出该数字,将hasOutput设为真
最后通过判断hasOutput判断是否有输出,如果没有输出,则输出No。

解法2:将数字数位分离保存到数组

枚举10000~30000的每一个数字,对于一个五位数字 a 1 a 2 a 3 a 4 a 5 a_1a_2a_3a_4a_5 a1a2a3a4a5将其数位分离,保存到数组a中。
而后分别进行数字组合,组合出 s u b 1 = a 1 a 2 a 3 sub_1=a_1a_2a_3 sub1=a1a2a3 s u b 2 = a 2 a 3 a 4 sub_2=a_2a_3a_4 sub2=a2a3a4 s u b 3 = a 3 a 4 a 5 sub_3=a_3a_4a_5 sub3=a3a4a5
判断这三个数字是否都是k的倍数,是则输出。
最后如果没有输出数字则输出No。

【题解代码】

解法1:取出三个三位数字
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
#define N 105
int main()
{
	bool hasOutput = false;
	int k, a, b, c;
	cin >> k;
	for(int i = 10000; i <= 30000; ++i)
	{
		a = i/100;
		b = i/10%1000;
		c = i%1000;
		if(a%k == 0 && b%k == 0 && c%k == 0)
		{
			hasOutput = true;
			cout << i << endl;
		}	
	}
	if(hasOutput == false)
		cout << "No";
	return 0;
}
解法2:将数字数位分离保存到数组
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
#define N 105
int main()
{
	bool hasOutput = false;
	int k, a[10], sub1, sub2, sub3;
	cin >> k;
	for(int i = 10000; i <= 30000; ++i)
	{
		for(int x = i, d = 5; x > 0; x /= 10, d--)
			a[d] = x%10;
		sub1 = a[1]*100+a[2]*10+a[3];
		sub2 = a[2]*100+a[3]*10+a[4];
		sub3 = a[3]*100+a[4]*10+a[5];
		if(sub1%k == 0 && sub2%k == 0 && sub3%k == 0)
		{
			hasOutput = true;
			cout << i << endl;
		}	
	}
	if(hasOutput == false)
		cout << "No";
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值