精华内容
下载资源
问答
  • 洛谷1255数楼梯,高精加法,递归
    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 &amp;lt;stdio.h&amp;gt; #include &amp;lt;string.h&amp;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:10
    char 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]={...//这里是
  • } 规律十分的明显: s[ i ]= s[ i -1 ] + 2 x s [ i - 2 ] 分析后发现我们要用高精来算 注意要先将结果算出来,再输入n。 避免每输入一个n 计算一次,这样重复做了好几遍,会 TLE。 #include #include #include ...
  • 自己写的高精 加法 乘法 代码 有注释 希望能够帮助你 赚点分 谢谢 多包涵 看不懂的 发消息给我吧
  • 高精度加法,相当于a+b problem,不用考虑负数. 输入格式 分两行输入。a,b<=10^{500} 输出格式 输出只有一行,代表a+b的值 输入输出样例 输入 #1 1 1 输出 #1 2 答案(在纸上模拟17903+6397) #include <stdio....
  •  //做加法要从后边开始加,倒着存到数组里,“-48”是为了字符转数字,ASCII码  for(i=0;i;i++)  b[lenb-i]=b1[i]-48;    lenc=1;    x=0;  //存进位    while(lenc||lenc)    {   c[lenc]=a[lenc]+...
  • 发现问题:代码在本地正常运行,交到OJ上AC50%,通过测试样例发现了部分数据存在问题 测试样例(部分)1 测试样例(部分)2 ...高精加法源代码(增加了memset对数组清零) #include<stdio.h> #include&.
  • #include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;cstring&gt;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...
  • 题目描述 用高精度计算出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。 输入输出格式 输入格式: ......
  • 星球上的人们用美味的食物招待了小Z,作为回报,小Z希望送一个能够完成B进制加法的计算器给他们。 现在小Z希望你可以帮助他,编写实现B进制加法的程序。 输入输出格式 输入格式: 共3行第1行:一个十进制的整数,表示...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,554
精华内容 621
关键字:

高精加法