一个无序自然数序列有N个自然数,快速找到二者之和为M的两个整数并输出。-小米电视

思路:首先对无序自然数数列进行排序(升序),然后定义i和j分别指向数列的两端,所指两数之和分别和M作比较,比M大,则j左移,比M小,则i右移。

代码如下:

#include <stdio.h>
#include <stdlib.h>

//快排
void sort(int *a, int left, int right)
{
    if(left >= right)
    {
        return ;
    }
    int i = left;
    int j = right;
    int key = a[left];

while(i < j)                               /*控制在当组内寻找一遍*/
    {
        //双向比较
        while(i < j && key <= a[j])
        {
            j--;                           //向前寻找
        }

a[i] = a[j];                    //交换位置

while(i < j && key >= a[i])
        {
            i++;                //向后寻找
        }

a[j] = a[i];             //交换位置
    }

a[i] = key;
    sort(a, left, i - 1);
    sort(a, i + 1, right);
}

int main()
{
    int a[10] = {-2,1,3,4,-5,12,45,34,23,9};
    int M = 26;
    int i, j;
    for(i = 0; i < 10; i++)
        printf("%d ",a[i]);
    printf("\n");
    sort(a, 0, 9);
    for(i = 0; i < 10; i++)
        printf("%d ",a[i]);
    printf("\n");
    i = 0;
    j = 9;
    while(i < j)
    {
        if(a[i] + a[j] == M)
            break;
        if(a[i] + a[j] > M)
            j--;
        else
            i++;
    }
    if(i != j)
        printf("%d + %d = %d\n",a[i],a[j],M);
    else
        printf("NO FIND!\n");
    return 0;
}

时间: 2024-10-27 11:26:09

一个无序自然数序列有N个自然数,快速找到二者之和为M的两个整数并输出。-小米电视的相关文章

20161127 输入两个自然数a、b,求a除以b的结果(保留两位小数)

题目: 输入两个自然数a.b,求a除以b的结果(保留两位小数). 代码: 1 program work20161127; 2 var 3 a,b,c:real; 4 BEGIN 5 readln(a,b); 6 c:=a/b; 7 writeln('c=',c:0:2); 8 END.

freemarker定义一个连续的序列

1.简易说明 定义一个连续的序列,并打印出序列中的元素 2.实现源码 <#--freemarker定义了一个连续的序列--> <#assign nums=1..100/> <#list nums as num> ${num} </#list> 3.实现结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

一个无序表单形成的类似于导航条的插件

//样式.sfbMaqtitle{width:960px;height:36px;background:#ff8500;padding:7px 0;font-size:18px;overflow:hidden;}.sfbMaqtitle li{cursor:pointer;display:inline-block;float:left;width:150px;line-height:36px;margin:0 43px;*margin:0 43px!important;*margin:0 40p

发送 一个无序广播

Intent intent = new Intent(); intent.setAction("cn.abel.action.broadcast"); intent.putExtra("trainingID", article.trainingID); // 发送 一个无序广播 _activity.sendBroadcast(intent); private class MyBroadcastReciver extends BroadcastReceiver { @

【C语言】输入一个整数,输出该数二进制表示中1的个数(三种方法)

输入一个整数,输出该数二进制表示中1的个数.如输入32,输出1. 代码实现: 方法1:与运算 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; int FindOneNumber(unsigned int num) {     int numberofOne = 0;     while (num)     {         num = num & (num - 1);         

c:how to program2.3另一个简单的程序:两个整数相加

我们下一个程序是用标注库中的scanf函数去获得用户输入的两个整型数,计算出他们的和并用printf打印出来,这个程序和输出在下面 //fig2.5// Addition program. #include <stdio.h> //function main begins program execution int main( void ) { int integer1; // first number to be entered by user int integer2; // second

22、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: n &(n-1)把n的最右边的1去掉,用count++计算1的个数  eg: 101 & 100 = 100   1 class Solution { 2 public: 3 int NumberOf1(int n) { 4 int count = 0; 5             while(n!=0){ 6                 count++; 7                 n = n&

C语言之函数调用02—一个三位数的正整数=它的各位数字的阶乘之和

//函数调用+枚举法 /* ========================================================== 题目:求一个三位数的正整数=它的各位数字的阶乘之和! 如:145=1!+4!+5!. ========================================================== */ #include<stdio.h> int J(int n) { int t=1,i; for(i=1;i<=n;i++) t*=i;

A、B两个整数集合,设计一个算法求他们的交集

代码留作记录,本人水平有限,看了别人的解法真是自愧不如. 关于此题的详细探讨可以参考:http://blog.csdn.net/thebestdavid/article/details/12056293 /*A.B两个整数集合,设计一个算法求他们的交集,尽可能的高效.*/ #include <iostream> #include <cstring> #include <set> #define M 8 #define N 5 using namespace std; i