在上个周的课余学习中我遇到了如下问题:
1.对于斐波那契数列的第K个数取关于10007的模(第K个数很大超出整型表示范围)。
解决方案:通常我们的思路是先求出斐波那契数列的第K个数,然后再对10007取余,但是这种方法会先得到一个无法用整型存储的“大数”,
在这里我们利用了取模运算的性质:(a + b)%c = (a%c + b%c) %c,这样的话在求斐波那契数列数列的过程中就对每一个元素取模,这样我们得到的
中间的数和最后的结果都不会超过10007,
for (int i = 3; i <= n; ++i)
{
ans = (temp_a + temp_b) % 10007;
temp_a = temp_b;
temp_b = ans;
}
2.进制转换的问题:
10 to B:辗转相除法,循环对十进制执行对B取余、除B,直到十进制数等于0,下面的例子是10 to 16.
#include <cstdio>
#define Max 20
int main(int argc, char const *argv[])
{
int num,tmp;
char array[Max];
for (int i = 0; i < Max; ++i)
{
array[i] = '\0';
}
int count = 0;
scanf("%d", &num);
if (num == 0)
{
printf("0\n");
}
while(num != 0)
{
tmp = num % 16;
if (tmp >= 0 && tmp <= 9)
{
array[count++] = tmp + 48;
}else
{
array[count++] = tmp + 55;
}
num = num / 16;
// printf("%c\n", array[count - 1]);
}
// printf("%d\n", count);
// count = 0;
for (int k = count-1; k >= 0; --k)
{
printf("%c", array[k]);
}
printf("\n");
return 0;
}
B to 10: 第n位上的数乘Base的(n-1)次幂然后求和,可以用字符数组来存储B,这样方便计算,下面的例子是16 to 10。
#include <stdio.h>
#include <cmath>
#define Max 20
int main(int argc, char const *argv[])
{
char array[Max];
scanf("%s",array);
// printf("%d\n", array[0]);
unsigned sum = 0;
int length = 0;
while(array[length] != '\0')
{
length++;
}
// printf("%d\n", length);
for (int i = 0; array[i] != '\0'; ++i)
{
// printf("%d\n", (int)pow(2,i));
if (array[i] >= 48 && array[i] <= 57)
{
sum += (int)pow(16,length-1)*(array[i] - 48);
length--;
}else
{
sum += (int)pow(16,length-1)*(array[i] - 55);
length--;
}
}
printf("%u\n", sum);
return 0;
}
二进制 到 十六进制的转换可以根据8421码,每四位二进制数表示一位十六进制数,最后不够四位高位补零。同理十六进制转换为二进制就是上面的逆过程。
二进制到八进制的转换就是:每三位二进制数转换为一位八进制数,421.
最后要注意字符数组的使用,可以很方便的存贮每一位的数据。