基础思维题的题解;数据结构初学;

本文介绍了如何解决一个编程问题,即给定一个整数MM,找到所有连续的正整数段,其和等于MM。首先讨论了暴力求解的方法,然后通过优化算法,如使用两个变量简化嵌套循环,以及利用重复数的概念,解决可以表示为重复数之和的问题。最后,还探讨了如何检查五位数是否满足整除条件的算法实现。
摘要由CSDN通过智能技术生成

对一个给定的正整数 MM,求出所有的连续的正整数段(每一段至少有两个数),这些连续的自然数段中的全部数之和为 MM。

例子:1998+1999+2000+2001+2002 = 100001998+1999+2000+2001+2002=10000,所以从 19981998 到 20022002 的一个自然数段为 M=10000M=10000 的一个解。

Input

包含一个整数的单独一行给出 MM 的值(10 \le M \le 2,000,00010≤M≤2,000,000)。

Output

每行两个正整数,给出一个满足条件的连续正整数段中的第一个数和最后一个数,两数之间用一个空格隔开,所有输出行的第一个按从小到大的升序排列,对于给定的输入数据,保证至少有一个解。

Sample 1

InputcopyOutputcopy
10000
18 142 
297 328 
388 412 
1998 2002

显然这道题有很多解法;在读题时不难发现 可以便利全部数看一下加到最后会不会等于输入的数;

#include<stdio.h>
int main()
{
    int m;
    scanf("%d",&m);
    for(int i=1;i<=m/2;i++){
        int t=i;
        int sum=t;
        while(sum<m){
            t++;
            sum+=t;
        }
        if(sum==m)
            printf("%d %d\n",i,t);
        else
            continue;
    }
    return 0;
}

这里用的是暴力求解;左区间从一开始遍历到m/2,右区间从左区间开始加,加到sum大于等于输入数时停止循环,如果等于就输出结果,否则就让左区间加一,直到循环结束。

这里用了嵌套循环,时间较复杂;

那么再思考一下不难发现可以借助两个变量来简化这个过程:

#include<stdio.h>
int main()
{
    int m;
	scanf("%d",&m);
	int lyz=3;
	for(int i=1,j=2;i<=m/2;)
	{
		if(lyz==m)
		{
			printf("%d %d\n",i,j);
			lyz-=i;
			i++;
		}
		else if(lyz<m)
		{
			j++;
			lyz+=j;
		}
		else
		{
			lyz-=i;
			i++;
		}
	}
	return 0;
}

这里借助了 i和 j 这两个数通过左右摇摆得到到符合条件的两个数,显然这里只用了一重循环,但是还是有同学发现不了这两个代码的区别,那就继续看;

仔细阅读会发现法一中的第二重循环改变的是右区间的值,而每次都将右区间的值归为了第一个值,所以改变想法,不改变右区间的值,通过用if语句巧妙的改变;

问题描述

一个重复数是一个在十进制表示中所有数字都是11的整数。按升序排列的重复数是1, 11, 111, \ldots1,11,111,…。

找到可以表示为恰好三个重复数之和的第NN小的整数。

约束条件

  • NN是一个介于11和333333之间(包括边界值)的整数。

输入

输入以以下格式从标准输入中给出:

NN

输出

输出答案。

示例 1

InputcopyOutputcopy
5
113

可以表示为恰好三个重复数之和的整数按升序排列为3, 13, 23, 33, 113, \ldots3,13,23,33,113,…。例如,113113可以表示为113 = 1 + 1 + 111113=1+1+111。

请注意,这三个重复数不必互不相同。

示例 2

InputcopyOutputcopy
19
2333

示例 3

InputcopyOutputcopy
333
112222222233

这个题可以说是易错题,只需要理清步骤还是非常简单的;

步骤:1.要用数组提前存好数据;这里要存两组数据。

2.利用三重循环来将三个数加起来存入数组。

3.加起来没有顺序还有很多一样的,所以要排序。

4.去重。

 

题目描述

对于一个五位数 \overline{a_1a_2a_3a_4a_5}a1​a2​a3​a4​a5​​,可将其拆分为三个子数:

sub_1=\overline{a_1a_2a_3}sub1​=a1​a2​a3​​

sub_2=\overline{a_2a_3a_4}sub2​=a2​a3​a4​​

sub_3=\overline{a_3a_4a_5}sub3​=a3​a4​a5​​

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

sub_1=202sub1​=202

sub_2=020\ (=20)sub2​=020 (=20)

sub_3=207sub3​=207

现在给定一个正整数 KK,要求你编程求出 1000010000 到 3000030000 之间所有满足下述条件的五位数,条件是这些五位数的三个子数 sub_1,sub_2,sub_3sub1​,sub2​,sub3​ 都可被 KK 整除。

输入格式

一个正整数 KK。

输出格式

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

输入输出样例

输入 #1复制

15

输出 #1复制

22555
25555
28555
30000

说明/提示

0<K<10000<K<1000

这是一道可以找到敲键盘感觉的题(简单题)。

先看代码:

#include<stdio.h>
int main()
{
    int k,e=0;
    scanf("%d",&k);
    for(int i=10000;i<=30000;i++){
        int sub1=i/100;
        int sub2=i/10%1000;
        int sub3=i%1000;
        if(sub1%k==0&&sub2%k==0&&sub3%k==0){
            printf("%d\n",i);
            e=1;
        }
    }
    if(e==0)
        printf("No");
    return 0;
}

 注意判断不存在的情况。

基本的数据结构

线性结构:线性表;栈和队列;串;数组和广义表。

非线性结构:树;图。

数据结构的研究内容

步骤:具体问题抽象为数学模型;设计算法;编程、调试、运行。

先了解了一点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值