zoukankan      html  css  js  c++  java
  • C++高精度

    高精度加法

    题目描述

    输入两个大整数a,b,输出他们的和。(1<=a,b<=10的100次方)

    输入

    输入两个大整数a和b。

    输出

    输入a加b的和。

    样例输入

    43434343445435343  32435647668754353
    

    样例输出

    75869991114189696
    

    程序+注释

    #include <bits/stdc++.h>
    using namespace std;
    char al[100],bl[100]; 
    int a[100],b[100],c[100];
    int main()
    {
    	scanf("%s",al);//不能用gets 
    	scanf("%s",bl);//因为这两个数之间只有一个空格 
    	int lena,lenb,lenc,x = 0;//x代表进位
    	lena = strlen(al);//lena是al数组的长度 
    	lenb = strlen(bl);//lenb是bl数组的长度 
    	for (int i = 0;i <= lena - 1;i ++)//把这个数字反着存储 al里的123就是a里面的321 
    		a[lena - i] = al[i] - '0';
    	for (int i = 0;i <= lenb - 1;i ++)//这个也是 
    		b[lenb - i] = bl[i] - '0';
    	lenc = 1;//循环变量 
    	while ((lenc <= lena) || (lenc <= lenb))//循环直到lenc等于al或者bl的长度 
    	{
    		c[lenc] = a[lenc] + b[lenc] + x;//(核心)把这两个数字加起来,并且加上进位 
    		x = c[lenc] / 10;//如果两个数加起来大于10,x就是1,否则取余的结果就是 0 
    		c[lenc] = c[lenc] % 10;// 
    		lenc ++;//自增 1  
    	}
    	c[lenc] = x;/*把最后一位进位过来*/ 
    	while (c[lenc] == 0)//如果最后一位为零 
    	{
    		lenc --;//把最后一位不输出  
    	}
    	for (int i = lenc;i >= 1;i --)//输出 
    	{
    		cout << c[i];
    	}
    	cout << endl;//回车 
    	return 0;
    }
    

    高精度减法

    题目描述

    输入两个大整数a,b,输出他们的差。(1<=a,b<=10的100次方)

    输入

    输入两个大整数a和b。

    输出

    输入a减b的差。

    样例输入

    35 45
    

    样例输出

    -10
    

    程序+注释

    #include <bits/stdc++.h>
    using namespace std;
    char s1[1000],s2[1000];
    int a[1000],b[1000],c[1000];
    int main()
    {
    	char n[1000];
    	scanf("%s %s",s1,s2);//也不能用gets 
    	if (strlen(s1) < strlen(s2) || strlen(s1) == strlen(s2) && strcmp(s1,s1) < 0)// 如果减数 大于 被减数 
    	{
    		strcpy(n,s1);strcpy(s1,s2);strcpy(s2,n);//把s1 和 s2 交换 
    		printf("-");//打印出“- ” 这个符号 
    	}
    	int len1 = strlen(s1);//s1 的长度  
    	int len2 = strlen(s2);//s2 的长度 
    	for (int i = len1 - 1;i >= 0;i --)//反着存储 
    	{
    		a[len1 - (i + 1) + 1] = s1[i] - '0';
    	}
    	for (int i = len2 - 1;i >= 0;i --)//反着存储 
    	{
    		b[len2 - (i + 1) + 1] = s2[i] - '0';
    	}
    	for (int i = 1;i <= len1;i ++)
    	{
    		a[i] = a[i] - b[i];//标准减法,把 a[i] - b[i] 的结果存在 a[i] 里面 
    		if (a[i] < 0)//退位  
    		{
    			a[i] = a[i] + 10; 
    			a[i + 1] --; //后面的一位自减1 
    		}
    	}
    	while (a[len1] == 0)//如果最后一位为零 
    	{
    		len1 --;//把最后一位不输出 
    	} 
    	for (int i = len1;i >= 1;i --)//输出 
    	{
    		printf ("%d",a[i]);//输出 
    	}
    }
    
  • 相关阅读:
    (转)linux下控制帐户过期的多种方法
    跟老男孩学Linx运维---web集群实战笔记
    (转)企业生产环境用户权限集中管理方案案例
    Linux 运维培训笔记
    (转)sudo配置文件/etc/sudoers详解及实战用法
    (转) RHEL7 忘记密码修改root密码
    (转)Mysql数据库之Binlog日志使用总结CentOS 7.x设置自定义开机启动,添加自定义系统服务
    git 删除远程分支
    crontab详解
    PHP数据库长连接mysql_pconnect用法
  • 原文地址:https://www.cnblogs.com/LJA001162/p/11033146.html
Copyright © 2011-2022 走看看