zoukankan      html  css  js  c++  java
  • POJ NOI MATH-7655 回文数个数

    问题链接POJ NOI MATH-7655 回文数个数


    总时间限制:
    1000ms
    内存限制:
    65536kB

    描述

    不超过n位的正整数中,有多少个回文数?

    输入
    一个正整数n,n <= 10。
    输出
    一个整数,即回文数个数。
    样例输入
    5
    样例输出
    1098
    来源
    《奥数典型题举一反三(小学五年级)》 (ISBN 978-7-5445-2882-5) 第一章 第二讲 习题16



    问题分析

      用穷举法进行计算是一种方法,但是容易导致运行时间超时。

      需要考虑采用递推和组合计算的办法来实现。

      只要能够写出递推式,就容易写一个递归函数来实现。简单的递归函数,往往也能找到其递推的计算方法。递归程序往往逻辑更加简洁易懂,递推程序速度更快并且使用的空间更少,两者各有优势。

    程序说明

      给出的穷举法程序,时间上超时了

      程序中,函数palindrom()和函数palindrom2()的功能是完全一样的,前者是递归实现的,后者是递推实现的。




    AC的C++语言程序:

    #include <iostream>
    
    using namespace std;
    
    const int BASE = 10;
    
    int palindrom(int n)
    {
        if(n == 1 || n == 2)
            return BASE - 1;
        else {
            if(n % 2 == 1)
                return palindrom(n-1) * BASE;
            else
                return palindrom(n-2) * BASE;
        }
    }
    
    // 递推的计算回文数函数,参数为10进制位数
    int palindrom2(int n)
    {
        if(n == 1 || n == 2)
            return BASE - 1;
    
        int p1= BASE - 1, p2 = BASE - 1, i, temp;
    
        i = 2;
        while(i < n) {
            i++;
            if(i % 2 == 1) {
                p1 = p2;
                p2 = p1 * BASE;
            } else {
                temp = p1;
                p1 = p2;
                p2 = temp * BASE;
            }
        }
    
        return p2;
    }
    
    int main()
    {
        int n, sum;
    
        cin >> n;
    
        sum = 0;
        for(int i=1; i<=n; i++)
            sum += palindrom2(i);
    
        cout << sum << endl;
    
        return 0;
    }



    TLE(Time Limit Exceeded)的C++语言程序:

    #include <iostream>
    
    using namespace std;
    
    bool ispalindrom(int n, int base)
    {
        int palindrom = 0, temp;
    
        temp = n;
        while(temp) {
            palindrom *= base;
            palindrom += temp % base;
            temp /= base;
        }
    
        return n == palindrom;
    }
    
    int main()
    {
        int n, max, count;
    
        cin >> n;
    
        max = 1;
        for(int i=1; i<=n; i++)
            max *= 10;
        max -= 1;
    
        count = 0;
        for(int i=1; i<=max; i++)
            if(ispalindrom(i, 10))
                count++;
    
        cout << count << endl;
    
        return 0;
    }




  • 相关阅读:
    交互设计实用指南系列(10)—别让我思考
    交互设计实用指南系列11-减少记忆负担
    交互设计实用指南系列(12)—避免出错
    复杂产品的响应式设计【流程篇】
    JS/jQuery判断DOM节点是否存在
    jquery.validate手册 (5)
    jquery.validate手册 (4)
    jquery.validate手册 (3)
    jquery.validate手册 (2)
    Java零基础学习(二)自定义类型及基本语法
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563972.html
Copyright © 2011-2022 走看看