-
2021-11-11 10:55:38
#include<stdio.h> int f[5005][5005], n, len = 1; void gjlt(int k) { for (int i = 1; i <= len; i++) {//循环让每位都相加 f[k][i] = f[k - 1][i] + f[k - 2][i];//i不变,表示每一位用递归加法 } for (int i = 1; i <= len; i++) {//高精加法 if (f[k][i] >= 10) {//该位已经大于十了, f[k][i + 1] = f[k][i] / 10 + f[k][i + 1];//下一位要进位 f[k][i] = f[k][i] % 10;//同时保留这一位的个位数 //怎么在最后一位加一位??? //在该位已经大于十的基础上,再判断该位的下一位是否为最后一位,是的话就加一位 if (f[k][len + 1]) len++; } //if (f[k][i + 1]) len++;不应该是下一位判断,而是判断现有的最后一位是否有数 } } int main() { scanf("%d", &n); f[1][1] = 1; f[2][1] = 2; for (int i = 3; i <= n; i++)//从3开始递归加法 gjlt(i); for (int i = len; i >= 1; i--) printf("%d", f[n][i]); return 0; }
更多相关内容 -
高精加法计算器.cpp
2021-08-19 15:16:00高精加法计算器.cpp -
[高精度]高精加法
2018-07-21 22:46:14高精度被广泛用于与巨数运算等方面,对做题很有帮助; #include &lt;stdio.h&gt; #include &lt;string.h&gt; char s1[10100]; char s2[10100]; int a[10100];... while高精度被广泛用于与巨数运算等方面,对做题很有帮助;
#include <stdio.h> #include <string.h> char s1[10100]; char s2[10100]; int a[10100]; int b[10100]; int main() { int pp;scanf("%d",&pp); while (pp--) { scanf("%s%s",s1,s2); int l1 = strlen(s1); int l2 = strlen(s2); int len; if (l1 > l2) len = l1; else len = l2; // for (int i = 0 ; i <= len ; i++) // a[i] = b[i] = 0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for (int i = l1 - 1 ; i >= 0 ; i--) a[l1 - i - 1] = s1[i] - '0'; for (int i = l2 - 1 ; i >= 0 ; i--) b[l2 - i - 1] = s2[i] - '0'; for (int i = 0 ; i < len ; i++) { a[i] = a[i] + b[i]; a[i+1]+= a[i] / 10; a[i] = a[i] % 10; } if (a[len] != 0) len++; for (int i = len - 1 ;i >= 0 ;i--) printf("%d",a[i]); printf("\n"); } return 0; }
剖析:
我们可以把源码分开来看
第一段:把字符串转换为整形数组(为了方便运算,倒序写入)scanf("%s%s",s1,s2); int l1 = strlen(s1); int l2 = strlen(s2); int len; if (l1 > l2) len = l1; else len = l2; // for (int i = 0 ; i <= len ; i++) // a[i] = b[i] = 0; memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for (int i = l1 - 1 ; i >= 0 ; i--) a[l1 - i - 1] = s1[i] - '0'; for (int i = l2 - 1 ; i >= 0 ; i--) b[l2 - i - 1] = s2[i] - '0';
第二段:把A和B中逐项相加.如果大于10则进位;
for (int i = 0 ; i < len ; i++) { a[i] = a[i] + b[i]; a[i+1]+= a[i] / 10; a[i] = a[i] % 10; }
第三段:如果有进位,长度加一
if (a[len] != 0) len++;
最后输出.
一个很好的模板,以后可以拿来用.
-
c++高精加法
2020-09-13 18:13:55总体思路:模拟竖式计算 首先,我们无法确定输入数字的大小,因此,我们使用string string a,b; cin>>a;cin>>b; 这不是废话吗 接着再定义两个整型变量用于计算输入数字... s--) { cout好了,以上就是高精加法的全部。总体思路:模拟竖式计算
首先,我们无法确定输入数字的大小,因此,我们使用string
string a,b; cin>>a;cin>>b;
这不是废话吗接着再定义两个整型变量用于计算输入数字的长度,之后再定义两个数组用于表示加数。
const int n=a.length(),m=b.length();//注意这里不能用sizeof()
为了防止加数数组中出现杂值,需要在main外进行初始化
int i[500];int j[500];//加数
以及答案
int ans[501];
同样的,也要初始化,注意这里要多一位,因为答案可能会多一位。
废话终于讲完了接下来,我们要将输入的两个字符行变量转化成整型变量,存储在加数数组中。
for(int s=0,l=n-1;s<n&&l>=0;s++,l--) { i[l]=a[s]-48; } for(int s=0,k=m-1;s<m&&k>=0;s++,k--) { j[k]=b[s]-48; }//字符转数字
为了防止出现错误,在调试时我们可以增添一段调试代码:
// for(int s=0;s<n;s++) // { // cout<<"i"<<ends<<i[s]<<endl; // } // for(int s=0;s<m;s++) // { // cout<<"j"<<ends<<j[s]<<endl; // } //调试程序,现已无用
我们还需要一个进位判定
int sb=0;//进位判定
多么优美的变量名我们还需要一个变量,它是两个加数中最大的加数的长度加一,具体用处一会儿会讲
int q=max(n,m)+1;
接着是重头戏:正式加法
for(int s=0;s<q;s++) { ans[s]+=i[s]+j[s];//单数位相加 if(ans[s]>=10) { sb=1; ans[s+1]+=sb; sb=0; ans[s]-=10; }//如果大于十就进位 }
没错,q就是这个用处,最大有多少位,就循环多少次。
照理来说,接下来就只需要输出了,但是我们忽略了一点:如果答案没有比加数多一位,那么第一位就会多输出一个0。
所以,最后一段程序在输出的同时还需要做到如果多输出了一个0,就去除。
int lenq=q; while (ans[lenq]==0 && lenq>0) lenq--; for(int s=lenq; s>=0; s--) { cout<<ans[s]; }//输出
最后来看一下完整代码
#include <bits/stdc++.h> using namespace std; int i[500];int j[500];//加数 int ans[501];//答案 int main() { string a,b; cin>>a;cin>>b;//输入 const int n=a.length(),m=b.length();//数组长度 int sb=0;//进位判定 /*cout<<n<<"---"<<m<<endl;调试*/ int q=max(n,m)+1; for(int s=0,l=n-1;s<n&&l>=0;s++,l--) { i[l]=a[s]-48; } for(int s=0,k=m-1;s<m&&k>=0;s++,k--) { j[k]=b[s]-48; }//字符转数字 // for(int s=0;s<n;s++) // { // cout<<"i"<<ends<<i[s]<<endl; // } // for(int s=0;s<m;s++) // { // cout<<"j"<<ends<<j[s]<<endl; // } //调试程序,现已无用 for(int s=0;s<q;s++) { ans[s]+=i[s]+j[s];//单数位相加 if(ans[s]>=10) { sb=1; ans[s+1]+=sb; sb=0; ans[s]-=10; }//如果大于十就进位 } int lenq=q; while (ans[lenq]==0 && lenq>0) lenq--; for(int s=lenq; s>=0; s--) { cout<<ans[s]; }//输出 return 0; }
好了,以上就是高精加法的全部。
-
C++高精加法
2020-08-15 22:31:12对应洛谷题目 ...相应的函数: reverse(str.begin(),str.end());翻转 ...tips:该代码只能解决A+B高精加法 #include<bits/stdc++.h> using namespace std; int main() { string a; string b;对应洛谷题目
https://www.luogu.com.cn/problem/P1601相应的函数:
reverse(str.begin(),str.end());翻转
str.find_first_not_of(‘0’);返回str中不为‘0’的剩余字符串,如果找不到,返回 npos;tips:该代码只能解决A+B高精加法
#include<bits/stdc++.h> using namespace std; int main() { string a; string b; cin>>a>>b; long long lenA=a.size(); long long lenB=b.size(); long long len=max(lenA,lenB)+10; string str(len,'0'); reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); for(int i=0;i<lenA;i++) { str[i]=a[i]; } int temp=0; for(int i=0;i<len;i++) { if(i<b.size()) temp+=str[i]-'0'+b[i]-'0'; else temp+=str[i]-'0'; str[i]=temp%10+'0'; temp/=10; } reverse(str.begin(),str.end()); if(str.find_first_not_of('0')!= string::npos) { str=str.substr( str.find_first_not_of('0') ); cout<<str<<endl; } else cout<<0<<endl; return 0; }
-
[P1601]高精加法[压位]
2017-02-05 09:37:33原题链接高精加法是比较熟悉的一个高精了,但是现在要练习压位,一开始觉得简单的合并就好,后来想起来还要保证压的这几位是顺序但是整体是倒序……想了一阵想了个比较麻烦的办法#include #include #include #... -
高精加法(string)
2019-12-14 17:44:05高精加法(string) 高精度加法主要是考虑 1.进位 2.数字与ASCII码的差异 3.位对齐问题 代码如下 #include<cmath> #include<iostream> #include<cstring> #include<string> using namespace ... -
2021.11.11高精加法
2021-11-08 17:03:53第二次修改 #include<stdio.h> #include<string.h> #define N 101 int main() { char a[N], b[N]; scanf("%s", a); scanf("%s", b); int c[N] = { 0 }; int len1 = strlen(a);... int j = len2... -
高精加法c++
2019-07-18 09:23:21#include using namespace std; string s1,s2; int a[10000],b[10000],s[10001],la,lb,l; int main(){ cin>>s1>>s2; la=s1.size(); lb=s2.size(); for(int i=0;i<la;i++) ...for(... -
k进制高精加法
2019-12-17 21:33:10char sixt[20] = "0123456789...string add(int k, string b) { //高精度加法过程,推广到 k 进制 string a = b; reverse(a.begin(), a.end()); int numa[maxN], numb[maxN], numc[maxN]; int len = a.leng... -
高精加法(不压位)
2021-02-03 13:58:15#include <cstdio> #include <cstring> int main() { char a[202]={0}, b[202]={0}; scanf("%s%s", a, b); int alen = strlen(a), blen = strlen(b), t = 0, i; int a1[202]={0}, b1[202]={...//这里是 -
【1041】 Computer Transformation 【递推 / 高精加法】
2021-05-07 10:26:57} 规律十分的明显: s[ i ]= s[ i -1 ] + 2 x s [ i - 2 ] 分析后发现我们要用高精来算 注意要先将结果算出来,再输入n。 避免每输入一个n 计算一次,这样重复做了好几遍,会 TLE。 #include #include #include ... -
大数高精加法 乘法算法代码
2008-05-15 22:41:16自己写的高精 加法 乘法 代码 有注释 希望能够帮助你 赚点分 谢谢 多包涵 看不懂的 发消息给我吧 -
Day27 洛谷P1601 A+B problem(高精加法)
2020-07-05 20:51:16高精度加法,相当于a+b problem,不用考虑负数. 输入格式 分两行输入。a,b<=10^{500} 输出格式 输出只有一行,代表a+b的值 输入输出样例 输入 #1 1 1 输出 #1 2 答案(在纸上模拟17903+6397) #include <stdio.... -
P1601 A+B Problem(高精加法)
2019-03-03 11:14:00//做加法要从后边开始加,倒着存到数组里,“-48”是为了字符转数字,ASCII码 for(i=0;i;i++) b[lenb-i]=b1[i]-48; lenc=1; x=0; //存进位 while(lenc||lenc) { c[lenc]=a[lenc]+... -
从高精加法的奇怪bug中get的关于scanf读字符串的小知识点
2021-01-12 13:26:12发现问题:代码在本地正常运行,交到OJ上AC50%,通过测试样例发现了部分数据存在问题 测试样例(部分)1 测试样例(部分)2 ...高精加法源代码(增加了memset对数组清零) #include<stdio.h> #include&. -
乱了我两个月的高精加法6666
2018-05-10 18:42:04#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int p=10010;char a1[p],b1[p];int a[p],b[p],c[p]; int main(){ int la,lb,... cin... -
18.7.29 luogu P1009 阶乘之和[高精加法&乘法]
2019-09-27 19:39:49题目描述 用高精度计算出S=1!+2!+3!+…+n! (n≤50)S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:5!=5 \times 4 \times 3 \times 2 \times 15!=5×4×3×2×1。 输入输出格式 输入格式: ...... -
题目:洛谷1604 B进制星球(高精加法 R进制)
2019-02-08 16:24:55星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。 输入输出格式 输入格式: 共3行第1行:一个十进制的整数,表示...
收藏数
1,554
精华内容
621