子数整数-题解-字符串/穷举

题目描述

对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:

sub1=a1a2a3

sub2=a2a3a4

sub3=a3a4a5

例如,五位数20207可以拆分成

sub1=202

sub2=020(=20)

sub3=207

现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1,sub2,sub3都可被K整除。

输入格式:

输入由键盘输入,输入仅一行,为正整数K

输出格式:

输出到文件,输出文件的每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“No”。

输入样例#1:

15

输出样例#1:

22555
25555
28555
30000

一开始我用老思路,一个循环循环所有数,再用字符串相关的知识来做

代码(有问题的): 

#include<bits/stdc++.h>
using namespace std;
int k;
int sum=0;
string int_str(int n){
	string s1="",s2="";
	int k=0;
	while(n!=0){
		s1+=(n%10+'0');
		n/=10;
		k++;
	}
	for(int j=k-1; j>=0; j++)
		s2+=s1[j];
	return s2;
}
int str_int(string s){
	int len=s.length();
	int m=0;
	for(int i=0; i<len; i++){
		m*=10;
		m+=(s[i]-'0');
	}
	return m;
}
string cnt(string str,int s,int e){
	string s1="";
	for(int i=s; i<=e; i++)
		s1+=str[i];
	return s1;
}
bool work(int n){
	string sub1=cnt(int_str(n),0,2),
	       sub2=cnt(int_str(n),1,3),
		   sub3=cnt(int_str(n),2,4);
	if(str_int(sub1)%k==0 && str_int(sub2)%k==0 && str_int(sub3)%k==0)
		return 1;
	else
		return 0;
}
int main(){
	cin>>k;
	for(int i=10000; i<=30000; i++)
		if(work(i)){
			cout<<i<<'\n';
			sum++;
		}
	if(sum==0)
		cout<<"NO";
	return 0;
}

我调了好多次,也没出来,请各位大佬帮忙挑挑错

最后我还是用穷举AC的

AC代码:

#include<bits/stdc++.h>
using namespace std;
int k;
int sum;
int main(){
	cin>>k;
	for(int i=1; i<=3; i++)
		for(int j=0; j<=9; j++)
			for(int m=0; m<=9; m++)
				for(int x=0; x<=9; x++)
					for(int y=0; y<=9; y++){
						int sub1=i*100+j*10+m,
							sub2=j*100+m*10+x,
							sub3=m*100+x*10+y;
						int num=i*10000+j*1000+m*100+x*10+y;
						if(sub1%k==0 && sub2%k==0 && sub3%k==0 && num<=30000){
							cout<<num<<'\n';
							sum++;
						}
					}
	if(sum==0)
		cout<<"No";
	return 0;
}

有更好的方法敬请指出

好的话请点赞加鸡腿~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值