高精度算法

本文介绍了使用高精度算法解决一系列计算问题,包括求解阶乘、分数的高精度表示、累加和、数的乘积,以及解决天使的起誓问题和汉诺塔双塔问题。每种问题都提供了输入输出示例,展示了如何运用高精度计算来得到精确结果。

1、求N!的值
【问题描述】
用高精度方法,求N!的精确值(N以一般整数输入)。
【输入样例】ni.in
10
【输出样例】ni.out
3628800

#include <cstdio>

int n,a[100000],l1 =1;

void input_data()
{
    scanf("%d",&n);
    for (int i = 1; i <= 999;i++) //先初始化存高精度的数组
        a[i] = 0;
    a[1] = 1; //0! == 1
}

void get_ans()
{
    for (int i = 1;i <= n;i++) //从1一直乘到n
        {
            int x = 0; //x用来处理进位
            for (int j = 1;j <= l1;j++)
                {
                    a[j] = a[j] *i + x;
                    x = a[j] / 10;
                    a[j] = a[j] % 10;
                }
            while ( x > 0) //处理数字的长度
                {
                    l1++;
                    a[l1] += x;
                    x = a[l1] / 10;
                    a[l1] = a[l1] % 10;
                }
        }
}

void output_ans()
{
    for (int i = l1;i >= 1;i--) //倒序输出
        printf("%d",a[i]);
}

int main()
{
    input_data();
    get_ans();
    output_ans();
    return 0;
}

2、求A/B高精度值
【问题描述】
计算A/B的精确值,设A,B是以一般整数输入,计算结果精确小数后20位
(若不足20位,末尾不用补0) 。
【输入样例】ab.in
4 3
【输出样例】ab.out
4/3=1.33333333333333333333
【输入样例】ab.in
6 5
【输出样例】ab.out
6/5=1.2

#include<cstdio>
#include<cstring>
using namespace std;
int c[30];
int main()
{
	int a,b,i,k;
	memset(c,0,sizeof(c));
	
	scanf("%d %d",&a,&b);
	
	c[0]=a/b;//来确定第非小数位
	a=(a%b)*10;//根据除法计算形式得出
	
	printf("%d",c[0]);
	printf(".");
	
	for(i=1;i<=20;i++)
		{
			c[i]=a/b;
			a=(a%b)*10;
			if(c[i]==0)
				break;                                             
		}
	for(k=1;k<i;k++)	 
		printf("%d",c[k]);
}

3、求n累加和(ja)
【问题描述】
用高精度方法,求s=1+2+3+……+n的精确值(n以一般整数输入)。
【输入样例】ja.in
10
【输出样例】ja.out
55

#include <cstdio>
 
int a[100],n,l = 1;
 
void input_data()
{
    scanf("%d",&n);
}
 
void get_ans()
{
    for (int i = 1;i <= 99;i++) //先给每个位上的数置0
        a[i] = 0;
    for (int i = 1;i <= n;i++) //从1 累加到 n
        {
            a[1] += i; //直接在个位上递增i
            for (int i = 1;i <= l;i++) //然后来处理进位问题 直接 + / 然后%一下就好
                {
                    a[i+1] += (a[i]/10);
                    a[i] = a[i] % 10;
                }
            while (a[l+1] > 0) //延长位数。用一个while和l就能搞定
                {
                    l++;
                    a[l+1] += (a[l] / 10);
                    a[l] = a[l] % 10;
                }
        }
}
 
void output_ans() //最后要逆序输出答案。
{
    for (int i = l;i >= 1;i--)
        printf("%d",a[i]);
}
 
int main()
{
    input_data();
    get_ans();
    output_ans();
    return 0;
}

4、阶乘和(sum)
【问题描述】
已知正整数N(N<=100),设S=1!+2!+3!+…N!。其中"!"表示阶乘,即N!=123*……(N-1)N,如:3!=123=6。请编程实现:输入正整数N,输出计算结果S的值。
【输入样例】sum.in
4
【输出样例】sum.out
33

5、高精度求积(MULTIPLY)
【问题描述】
输入两个高精度正整数M和N(M和N均小于100位)。
【问题求解】
求这两个高精度数的积。
【输入样例】MULTIPLY.IN
36
3
【输出样例】MULTIPLY.OUT
108

6、天使的起誓(YUBIKILI.pas)
【问题描述】
TENSHI非常幸运的被选为掌管智慧之匙的天使。在正式任职之前,她必须和其他新当选的天使一样,要宣誓。宣誓仪式是每位天使各自表述自己的使命,她们的发言稿被放在N个呈圆形排列的宝盒中。这些宝盒按顺时针方向被编上号码1、2、3……、N-1、N。一开始天使们站在编号为N的宝盒旁。她们各自手上都有一个数字,代表她们自己的发言稿所在的盒子是从1号盒子开始按顺时针方向的第几个。例如:有7个盒子,那么如果TENSHI手上的数字为9,那么她的发言稿所在盒子就是第2个。现在天使们开始按照自己手上的数字来找发言稿,先找到的就可以先发言。TENSHI一下子就找到了,于是她最先上台宣誓:“我将带领大家开启NOI之门……”TENSHI宣誓结束以后,陆续有天使上台宣誓。可是有一位天使找了好久都找不到她的发言稿,原来她手上的数字M非常大,她转了好久都找不到她想找的宝盒。
【问题求解】
请帮助这位天使找到她想找的宝盒的编号。
【输入格式】
从文件YUBIKILI.IN的第一、二行分别读入正整数N和M,其中N、M满足
  2 ≤ N ≤ 108,2 ≤ M ≤ 101000
【输出格式】
把所求宝盒的编号输出到文件YUBIKILI.OUT,文件只有一行(包括换行符)。
样例一
YUBIKILI.IN YUBIKILI.OUT
7 2
9

样例二
YUBIKILI.IN YUBIKILI.OUT
11 9
108

7、Hanoi双塔问题(Noip2007)
【问题描述】
给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
【输入格式】
输入文件hanoi.in为一个正整数n,表示在A柱上放有2n个圆盘。
【输出格式】
输出文件hanoi.out仅一行,包含一个正整数, 为完成上述任务所需的最少移动次数An。
样例一
hanoi.in hanoi.out
1 2
样例二
hanoi.in hanoi.out
2 6
【限制】
对于50%的数据,1<=n<=25
对于100%的数据,1<=n<=200
【提示】设法建立An与An-1的递推关系式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值