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

被折叠的 条评论
为什么被折叠?



