这几天都没有做什么题,一直在看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
:题意是根据条件求斐波那契数列,然后给出两个数a
和b
,求在这两个数之间的斐波那契数的数量。
这题的数字最大能有10^100
,用整型
存肯定是不行的,必须用string
来,我的思路是,写一个字符串相加函数str_add
和字符串比较函数str_cpr
,用前者计算好所有的斐波那契数后,遍历数组用后者与a
和b
比较,如果符合就累加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;
}
}