取模性质&进制转换

来源:互联网 发布:小米路由器 数据分析 编辑:程序博客网 时间:2024/05/16 17:04

在上个周的课余学习中我遇到了如下问题:

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 20int 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 20int 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.

最后要注意字符数组的使用,可以很方便的存贮每一位的数据。


0 0