高精度考试

13 篇文章 0 订阅

A除以B

题目描述

本题要求计算A/B,其中A是不超过1000位的正整数,B是1位正整数。你需要输出商数Q和余数R,使得A = B * Q + R成立。

输入格式

输入在1行中依次给出A和B,中间以1空格分隔。

输出格式

在1行中依次输出Q和R,中间以1空格分隔。

样例

输入数据#1

123456789050987654321 7

Copy

输出数据#1

17636684150141093474 3
#include<bits/stdc++.h>
using namespace std;
int b,c[10001],t=0,f,d[10001];
int main()
{
    string a;
    cin>>a>>b;
    int la=a.size(),i,p;
    for(i=0;i<=la-1;i++)
	{
        t=t*10+a[i]-48;
        c[i]=t/b;d[i]=t/b;
        t=t%b;
    }
    for(i=0;i<=la-1;i++)
	{
        if(c[i]!=0)
		{ 
            p=i;
            f=1;
            break;
            
        }
    }
    if(f==1)
	{
        for(i=p;i<=la-1;i++)
        {
		   cout<<c[i];   
		}cout<<" "<<t;
    }
    else
	{
        cout << 0;cout<<" "<<t;
    }
    
    return 0;
}


 高精度乘法

题目描述

求两个正整数之积

输入格式

共两行,每行一个正整数,每个数小于1000位

输出格式

求两整数的积

样例

输入数据#1

12
12

Copy

输出数据#1

144
#include<bits/stdc++.h>
using namespace std;    
int p,a[1010],b[1010],c[2010];
int k=0,t=0;
string s21,s22; 
int main(){
    cin>>s21>>s22;
    if(s21=="0"||s22=="0")
	{
        cout << 0;
        return 0;
    } 
    int len1=s21.size(),len2=s22.size();
    for(int i=len1-1;i>=0;i--)
	{ 
        a[k]=s21[i]-48; 
        k++;    
    } 
    for(int i=len2-1;i>=0;i--)
	{  
        b[t]=s22[i]-48;
        t++;     
    }
    for(int i=0;i<=len1-1;i++)
	{   
         for(int j=0;j<=len2-1;j++)
		 {  
            c[i+j]=c[i+j]+a[i]*b[j];
         }
    }
    int len=s21.size()+s22.size();
    for(int i=0;i<len;i++)
	{
        c[i+1]=c[i+1]+c[i]/10;
        c[i]=c[i]%10;
    }
    for(int i=len;i>=0;i--)
	{
        if(c[i]!=0)
		{ 
			p=i;break;
		}
    }
    
    for(int i=p;i>=0;i--)
	{
        cout<<c[i];
    }
    return 0;
}


 高精度加法

题目描述

计算两个非负整数之和

输入格式

从键盘上输入两个非负整数,每个数占一行,每个数的位数不超过240.

输出格式

输出只有一行为两个数之和。

样例

输入数据#1

12
13

Copy

输出数据#1

25
//***wuhaotian***//
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[250],b[250],c[250];
int k=0,t=0,p;
int main(){
    cin >> s1>> s2;
    int len1=s1.size(),len2=s2.size(),len;
    for(int i=len1-1;i>=0;i--)
	{
        a[k]=s1[i]-48;
        k++;
    }
    for(int i=len2-1;i>=0;i--)
	{
        b[t]=s2[i]-48;
        t++;
    }
    len=max(len1,len2);
    for(int i=0;i<len;i++)
	{ 
        c[i]=a[i]+b[i];
    }
    for(int i=0;i<len;i++)
	{ 
        if(c[i]>=10)
		{
            c[i+1]=c[i+1]+c[i]/10;c[i]=c[i]%10;
        } 
    }
    for(int i=len;i>=0;i--)
	{
        if(c[i] != 0)
		{
            p=i;
            break;
        }
    }
    
    for(int i=p;i>=0;i--)
	{
        cout << c[i];
    }
}

 高精度减法

题目描述

计算两个非负整数之差

输入格式

从键盘上输入两个非负整数,每个数占一行,每个数的位数不超过240.

输出格式

输出只有一行为两个数之差。

样例

输入数据#1

12
13

输出数据#1

-1

 

#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[260],b[260],c[260];
int main(){
    int k=0,t=0,p=0;
    char f='-';
    cin >> s1>> s2;
    int len1= s1.size(),len2=s2.size();
    if(len1<len2 || len1==len2&&s1<s2)
	{ 
        cout <<f;
        swap(s1,s2);
    }
    len1= s1.size(),len2=s2.size();
    for(int i=len1-1;i>=0;i--)
	{
        a[k]=s1[i]-'0';
        k++;
    } 
    for(int i=len2-1;i>=0;i--)
	{
        b[t]=s2[i]-'0';
        t++;
    }
    for(int i=0;i<len1;i++)
	{
        if(a[i]<b[i]){
            a[i+1]-=1; 
            a[i]=a[i]+10;
        }
        c[i]=a[i]-b[i];
    } 
    for(int i=len1-1;i>=0;i--)
	{ 
        if(c[i]!=0)
		{
            p=i;
            break;
        }
    }
    for(int i=p;i>=0;i--)
	{
        cout << c[i];
    } 
}

【基础】求2的n次方

题目描述

求2的n次方!(0≤n≤200)

输入格式

从键盘读入一个整数n。

输出格式

请输出2的n次方。

样例

输入数据#1

100

Copy

输出数据#1

1267650600228229401496703205376
#include<bits/stdc++.h>
using namespace std;
string mul(string s1, string s2)
{
    string s;
    int a[1000]={0},b[1000]={0},c[2000]={0},t=0,p;
    int len1=s1.size(),len2=1;//注意长度在外面定义
    for(int i=len1-1;i>=0;i--){  
        a[t]=s1[i]-48;
        t++;     
    }
    b[0]=2;
    for(int i=0;i<=len1-1;i++){   
         for(int j=0;j<=len2-1;j++){  
            //第i位和第j位相乘的结果一定是对应在i+j位
            //一定要注意是+=,因为某一位上可能存放着多组乘积  
            c[i+j]=c[i+j]+a[i]*b[j];
         }
    }
    int len=s1.size()+s2.size();//结果的长度最长a.size()+b.size()
    for(int i=0;i<len;i++){//处理进位 
        c[i+1]=c[i+1]+c[i]/10;
        c[i]=c[i]%10;
    }
    for(int i=len;i>=0;i--){
        if(c[i]!=0){  p=i;break;}//找出最高不为0的位置 
    }
    for(int i=p;i>=0;i--){
        s += c[i]+48;
    }
    return s;
}
int main()
{
    string  ans = "1",str2 = "2";
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        ans = mul(ans,str2);
    }
    cout<<ans;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值