取模性质&进制转换

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

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.

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值