【用脚趾头解决NOIP】(3)NOIP2010普及组阅读程序写运行结果

(您的好友【老司机】已上线)
(您的好友【老司机】开启了群飙车,快来啊)

NOIP2010

第一题:交换
题目源代码

#include<iostream> 
using namespace std; 
void swap(int &a,int &b) { 
    int t;     
    t=a;     
    a=b;     
    b=t; 
} 
int main() { 
    int a1,a2,a3,x; 
    cin>>a1>>a2>>a3;     
    if(a1>a2) 
        swap(a1,a2);
    if(a2>a3) 
        swap(a2,a3);     
    if(a1>a2) 
        swap(a1,a2);     
    cin>>x;     
    if(x<a2)         
        if(x<a1) 
            cout<<x<<' '<<a1<<' '<<a2<<' '<<a3<<endl;     else 
            cout<<a1<<' '<<x<<' '<<a2<<' '<<a3<<endl;     else 
    if(x<a3) 
        cout<<a1<<' '<<a2<<' '<<x<<' '<<a3<<endl;     else 
        cout<<a1<<' '<<a2<<' '<<a3<<' '<<x<<endl;     
        return 0; 
}

输入数据:

91 2 20 
77

思路分析:
这道题的整个流程如下:
这里写图片描述
那么这题就不需要多讲了吧~

本题答案: 2 20 77 91


第二题:回文数

题目源代码:

#include<iostream> 
using namespace std; 
int rSum(int j) { 
    int sum=0;     
    while(j!=0)     { 
        sum=sum*10+(j%10);         
        j=j/10;     
    } 
    return sum; 
} 
int main() { 
    int n,m,i;     
    cin>>n>>m;     
    for(i=n;i<m;i++)        
           if(i==rSum(i))            
                cout<<i<<' ';     
    return 0; 
}

输入数据:

90 120

思路分析:
这道题看上去就觉得不对!
我们仔细观察一下这串代码,然后代一个数进去(我们拿90这个数举栗)
如果根据这个代码走一遍流程,我们会得到…..
该数倒过来的数(如:90倒过来就是09,0被省略)
那么这道题就是判断一个数是否是一个回文数(即正反数一样的数,如11)
那么在90~120以内的回文数总共有三个:
99 , 101 , 111

本题答案: 99,101,111

第三题:最大与次大
题目源代码:

#include<iostream> 
#include<string> 
using namespace std;  
int main() { 
    string s;     
    char m1,m2;     
    int i; 
    getline(cin,s);     
    m1=' ';     
    m2=' '; 
    for(i=0;i<s.length();i++)         
    if(s[i]>m1)         
    { 
        m2=m1;            
         m1=s[i];         
         } 
    else  if(s[i]>m2)           
     m2=s[i]; 
    cout<<int(m1)<<' '<<int(m2)<<endl;     
    return 0; 
    } 

这里写图片描述
输入数据:

Expo 2010 Shanghai China

思路描述:
这里我们发现,循环指令正在找一个最大值和次大值,即输入字符串中的ascll最大值和次大值。那么输出最大值和次大值就可以了。

本题答案: 120(‘n’) 112(‘h’)

第四题:是or不是?

题目源代码:

#include<iostream> 
using namespace std; 
const int NUM=5; 
int r(int n) { 
    int i; 
    if(n<=NUM)         
        return n;
    for(i=1;i<=NUM;i++)         
        if(r(n-i)<0)             
            return i;     
    return -1; 
}  
int main() { 
    int n;     
    cin>>n; 
    cout<<r(n)<<endl;     
    return 0; 
    }

输入数据<1>:

4

输入数据<2>:

16

思路描述:
递归代码中,有一句:for(i=1;i<=NUM;i++),得到了我们要枚举每一个i。
我们的操作如下:
1.如果当前用于递归的数<5,则返回这个数。
2.对于每一次的递归,将i从1~5枚举,我们每一次如果都找不到一个数(n-i),使得这个数的返回值为-1,那么就返回-1。如果找到任何一个数,就返回i。

根据上面的操作走一遍,很容易就得出答案。

本题答案:
<1>1
<2>4

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值