zoukankan      html  css  js  c++  java
  • 大数相加

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define STRLENTH 100
    /*数组转置*/
    void reverse(char str[])
    {
    	int left = 0;//第一个元素
    	int right = strlen(str)-1;//最后一个元素
    	char temp;
    	while(left < right)
    	{
    		temp = str[left];
    		str[left] = str[right];
    		str[right] = temp;
    		left++;
    		right--;
    	}
    }
    char* big_num_add(char str1[],char str2[])
    {
    	int n1 = strlen(str1);	//求第一个加数的位数
    	int n2 = strlen(str2);	//求第二个加数的位数
    	int n = n1>n2 ? n1:n2;	//求两个加数中最大的位数
    	int i = 0;
    	int flag = 0;			//进位值,个位相加时,没有进位
    	char sum ;				//每一位相加的和
    	char *str3;				//存放和
    
    /*存放加数的和,两个加数的最大位+两位,存放(''(reverse函数用到,strlen)及最高位有可能产生的进位)*/
    	str3 = (char*)malloc(sizeof(char)*(n+2));
    
    	n1--;//指向最低位的下标(从个位开始计算)
    	n2--;
    	while(n1 >= 0 && n2 >= 0)
    	{
    		/*求每一位上的和:本位和 + 进位*/
    		sum = str1[n1] + str2[n2] + flag - '0';
    		/*有进位*/
    		if(sum > '9')
    		{
    			str3[i] = sum - 10;	//去掉进位后存于数组中
    			flag = 1;			//有进位,加法进位只能是1
    		}
    		/*无进位*/
    		else
    		{
    			str3[i] = sum;
    			flag = 0;
    		}
    		/*为下一位做准备*/
    		n1--;
    		n2--;
    		i++;
    	}
    	/*处理位数高的剩余位*/
    
    	if(n1 > n2)//第一位没有处理完
    	{
    	//	for(;n1>=0;n1--)
    		while(n1 >= 0)
    		{
    			sum = str1[n1] + flag ;//上一位的进位
    			if(sum > '9')
    			{
    				str3[i] = sum - 10;	//去掉进位后存于数组中
    				flag = 1;			//有进位,加法进位只能是1
    			}
    			else
    			{
    				str3[i] = sum;
    				flag = 0;
    			}
    			n1--;
    			i++;
    		}
    	}
    	if(n2 > n1)//第二个加数,没有处理完
    	{
    		while(n2 >= 0)
    		{
    			sum = str2[n2] + flag ;//上一位的进位
    			if(sum > '9')
    			{
    				str3[i] = sum - 10;	//去掉进位后存于数组中
    				flag = 1;			//有进位,加法进位只能是1
    			}
    			else
    			{
    				str3[i] = sum;
    				flag = 0;
    			}
    			n2--;
    			i++;
    		}
    	}
    	/*加完之后看看是否有进位:99+999,加完之后仍有进位*/
    	if(flag == 1)
    	{
    		str3[i] = '1';
    		i++;
    		str3[i] = '';
    	}
    	else
    		str3[i] = '';//和数组最后赋值''
    /*上述操作执行完后,低位存到了前面,高位存在了后面,所以得转置过来*/
    	reverse(str3);
    	return str3;
    }
    
    int main()
    {
    	char add1[STRLENTH];
    	char add2[STRLENTH];
    	gets(add1);
    	gets(add2);
    	printf("the sum is:%s
    ",big_num_add(add1,add2));
    	return 0;
    }
    
    
    
    
  • 相关阅读:
    MSI文件静默安装
    C#文本文件或其他文件新内容追加
    VS2015在线安装包
    Hive创建表时添加中文注释后乱码问题
    scala获取字符串首字符和尾字符
    kafka topic常用命令
    supervisord实例配置
    pandas写数据进入数据库
    supervisord初体验
    python3 安装impyla相关的包
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9527980.html
Copyright © 2011-2022 走看看