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;
    }
    
    
    
    
  • 相关阅读:
    内存溢出与内存泄漏
    Android性能优化系列之Bitmap图片优化
    android 内存泄漏,以及检测方法
    android view绘制流程 面试
    USACO milking cows
    USACO beads
    POJ3311 TSP问题 xingxing在努力
    HDU5074 dp xingxing在努力
    HDU2821 深搜 xingxing1024
    HDU5592 排队问题 xingxing在努力
  • 原文地址:https://www.cnblogs.com/NikkiNikita/p/9527980.html
Copyright © 2011-2022 走看看