首页 > 其他 > 详细

1001 A+B Format (20分)

时间:2020-03-03 15:29:21      阅读:70      评论:0      收藏:0      [点我收藏+]

 

Calculate a+b and output the sum in standard format -- that is, the digits must be separated into groups of three by commas (unless there are less than four digits).

Input Specification:

Each input file contains one test case. Each case contains a pair of integers a and b where −. The numbers are separated by a space.

Output Specification:

For each test case, you should output the sum of a and b in one line. The sum must be written in the standard format.

Sample Input:

-1000000 9
 

Sample Output:

-999,991

 

我真的想的太复杂了吧......int的范围足以应对了,不必用大整数的思路去做...

但还是要学习一下处理字符串和字符串与数字的转换。

1.string.h中,strlen(s)可以直接得到字符串的长度,s可以是字符数组,strlen(s)得到‘\0‘前的字符个数。(字符数组最后一个字符必须是‘\0‘)。

2.字符数字-‘0‘可以得到int型数字。

3.m%10可以得m的个位数,m/10可以得到m的十位数。

4.测试点3和10的处理是以下代码的第37,38行,看看可能产生的进位是不是被忽略掉了。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<string.h>
  4 using namespace std;
  5 struct bign{
  6     int data[10];
  7     int len;
  8     int flag;
  9     bign(){
 10         memset(data,0,sizeof(data));
 11         len=0;
 12         flag=1;
 13     }
 14 };
 15 bign reverse(char s[]){
 16     bign a;
 17     for(int i=strlen(s)-1,j=0;i>=0;i--)
 18     {   
 19         if(s[i]!=-)
 20             {a.data[j++]=s[i]-0;
 21              a.len++;
 22         }
 23         else
 24             a.flag=-1;
 25     }
 26     return a;
 27 }
 28 bign add(bign a,bign b){
 29     bign answer; 
 30     int carry=0;
 31     int temp=0;
 32     for(int i=0;i<a.len||i<b.len;i++){
 33         temp=a.data[i]+b.data[i]+carry;
 34         carry=temp/10;
 35         answer.data[(answer.len)++]=temp%10;
 36     }
 37     if(carry)//处理可能的进位 
 38      answer.data[(answer.len)++]=carry;
 39     answer.flag=a.flag;
 40     return answer;
 41 }
 42 bign subtract(bign a,bign b){
 43     bign answer;
 44     
 45     for(int i=0;i<a.len||i<b.len;i++){
 46         if(a.data[i]<b.data[i])
 47            {a.data[i+1]--;
 48            a.data[i]+=10;}
 49            
 50     answer.data[(answer.len)++]=a.data[i]-b.data[i];
 51     }
 52     while(answer.len>=2&&answer.data[answer.len-1]==0)//除掉可能出现的高位的0,且至少留一位 
 53       answer.len--;
 54       
 55     return answer;    
 56 }
 57 int compare(bign a,bign b){
 58     if(a.len>b.len) return 1;
 59     else if(a.len<b.len) return -1;
 60     else
 61     {
 62         for(int i=a.len-1;i>=0;i--)
 63         {if(a.data[i]>b.data[i]) return 1;
 64         if(a.data[i]<b.data[i]) return -1;}
 65     }
 66     
 67     return 0;
 68 }
 69 int main(){
 70     char m[10],n[10];
 71     scanf("%s%s",m,n);
 72     bign a,b,c;
 73     a=reverse(m);
 74     b=reverse(n);
 75     
 76     if(a.flag==b.flag)//正负号相同,做加法 
 77       c=add(a,b);
 78     else//正负号不同,减法
 79        {
 80            if(a.flag<b.flag)//令a为正数,b为负数 ,方便比较 
 81            {    bign temp;
 82             temp=a;
 83             a=b;
 84             b=temp; 
 85            }
 86         int com=compare(a,b);
 87         if(com>=0)//绝对值大的减去绝对值小的 
 88            c=subtract(a,b);
 89         else
 90            {c=subtract(b,a);//若b的绝对值大,交换相减并添加负号 
 91             c.flag=-1;}    
 92            
 93        }
 94             
 95       
 96     if(c.flag<0)
 97        printf("%c",-);  
 98     for(int i=c.len-1;i>=0;i--)
 99     {    
100     printf("%d",c.data[i]);
101     if(!(i%3)&&i)
102       printf("%c",,);
103     } 
104  
105 
106 return 0;
107 }

 

 

1001 A+B Format (20分)

原文:https://www.cnblogs.com/wsshub/p/12402253.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!