对一个给定的正整数 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
Inputcopy | Outputcopy |
---|---|
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
Inputcopy | Outputcopy |
---|---|
5 | 113 |
可以表示为恰好三个重复数之和的整数按升序排列为3, 13, 23, 33, 113, \ldots3,13,23,33,113,…。例如,113113可以表示为113 = 1 + 1 + 111113=1+1+111。
请注意,这三个重复数不必互不相同。
示例 2
Inputcopy | Outputcopy |
---|---|
19 | 2333 |
示例 3
Inputcopy | Outputcopy |
---|---|
333 | 112222222233 |
这个题可以说是易错题,只需要理清步骤还是非常简单的;
步骤:1.要用数组提前存好数据;这里要存两组数据。
2.利用三重循环来将三个数加起来存入数组。
3.加起来没有顺序还有很多一样的,所以要排序。
4.去重。
题目描述
对于一个五位数 \overline{a_1a_2a_3a_4a_5}a1a2a3a4a5,可将其拆分为三个子数:
sub_1=\overline{a_1a_2a_3}sub1=a1a2a3
sub_2=\overline{a_2a_3a_4}sub2=a2a3a4
sub_3=\overline{a_3a_4a_5}sub3=a3a4a5
例如,五位数 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;
}
注意判断不存在的情况。
基本的数据结构
线性结构:线性表;栈和队列;串;数组和广义表。
非线性结构:树;图。
数据结构的研究内容
步骤:具体问题抽象为数学模型;设计算法;编程、调试、运行。
先了解了一点。