Life of xhu

About

HOJ_1462 & HOJ_1474

Mar 22, 2014

  |   #HOJ

这几天都没有做什么题,一直在看C++ Primer Plus,什么时候还是写篇这几天看书的文章吧,感觉看了知识不写下来,总是很容易忘。

今天手痒了刷了两道,都是一次就AC的水题。

1462:就是根据图中的例子,找出蜂房序号和坐标的对应关系,我观察到的是,以1为中心,每一圈都是6*i个蜂房,而一圈中的蜂房又可以分为6段,每一段的坐标变化规律都是相同的,抓住这个要点,剩下的就是数学问题了。

代码如下:

#include <iostream>
#include <cstdio>
using namespace std;

int main(){
    int n, sum, tmp, init1, init2, i;
    while(scanf("%d", &n) != EOF){
        if(n == 1)
            cout << 0 << ' ' << 0 << endl;
        else{
            sum = 1;
            tmp = 0;
            while(++tmp){
                if(sum + tmp * 6 >= n)
                    break;
                else
                    sum += tmp * 6;
            }
            init1 = tmp - 1;
            init2 = 1;
            for(i = 0; sum <= n - 1; sum++, i++){
                if(i >= 1 && i < tmp){
                    init1--;
                    init2++;
                }else if(i >= tmp && i <= tmp * 2 - 1)
                    init1--;
                else if(i >= tmp * 2 && i <= tmp * 3 - 1)
                    init2--;
                else if(i >= tmp * 3 && i <= tmp * 4 - 1){
                    init1++;
                    init2--;
                }else if(i >= tmp * 4 && i <= tmp * 5 - 1)
                    init1++;
                else if(i >= tmp * 5 && i < tmp * 6)
                    init2++;
            }
            cout << init1 << ' ' << init2 << endl;
        }
    }
}  

1474:题意是根据条件求斐波那契数列,然后给出两个数ab,求在这两个数之间的斐波那契数的数量。

这题的数字最大能有10^100,用整型存肯定是不行的,必须用string来,我的思路是,写一个字符串相加函数str_add和字符串比较函数str_cpr,用前者计算好所有的斐波那契数后,遍历数组用后者与ab比较,如果符合就累加count,最后输出count即可。

代码如下:

#include <iostream>
#include <string>
using namespace std;

string str_add(string str1, string str2){
    int len1 = str1.length(), len2 = str2.length(), plus = 0, tmp;
    string result = "";
    if(len1 > len2){
        for(int i = 0; i < len1 - len2; i++)
            str2 = "0" + str2;
    }else if(len2 > len1){
        for(int i = 0; i < len2 - len1; i++)
            str1 = "0" + str1;
        len1 = len2;
    }
    for(int i = len1 - 1; i >= 0; i--){
        tmp = plus ? (int)str1[i] + (int)str2[i] - (int)'0' * 2 + 1 : (int)str1[i] + (int)str2[i] - (int)'0' * 2;
        if(tmp > 9){
            result = (char)(tmp - 10 + '0') + result;
            plus = 1;
        }else{
            result = (char)(tmp + '0') + result;
            plus = 0;
        }
    }
    if(plus)
        result = "1" + result;
    return result;
}

bool str_cpr(string str1, string str2){
    if(str1.length() > str2.length()){
        return true;
    }else if(str1.length() < str2.length()){
        return false;
    }else{
        for(int i = 0; i < str1.length(); i++){
            if(str1[i] > str2[i])
                return true;
            else if(str2[i] > str1[i])
                return false;
        }
    }
    return true;
}

int main(){
    int count;
    string fi[500], a, b;
    fi[0] = "1";
    fi[1] = "2";
    for(int i = 2; i < 500; i++)
        fi[i] = str_add(fi[i - 1], fi[i - 2]);
    while(cin >> a >> b && !(a == "0" && b == "0")){
        count = 0;
        for(int i = 0; i < 500; i++){
            if(str_cpr(fi[i], a) && str_cpr(b, fi[i]))
                count++;
        }
        cout << count << endl;
    }
}