程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> (ACM_JD)題目1003:A+B,acm_jd1003

(ACM_JD)題目1003:A+B,acm_jd1003

編輯:C++入門知識

(ACM_JD)題目1003:A+B,acm_jd1003


此題不僅僅是A+B簡單計算的一道題,需要進行字符和數字的靈活轉換。

 

題目描述:
給定兩個整數A和B,其表示形式是:從個位開始,每三位數用逗號","隔開。
現在請計算A+B的結果,並以正常形式輸出。


輸入:
輸入包含多組數據數據,每組數據占一行,由兩個整數A和B組成(-10^9 < A,B < 10^9)。

輸出:
請計算A+B的結果,並以正常形式輸出,每組數據占一行。

樣例輸入:
-234,567,890 123,456,789
1,234 2,345,678

樣例輸出:
-111111101
2346912

 

分析:

//題目1003:A+B
/*解題算法: 把輸入以字符串形式輸入,然後先去掉第一個符號為'-'的, 同時用flag = 0,
 *變化成 flag = 1來記錄該字符串所表示的數為負數. 這樣把字符統一處理為沒有 '-'的,
 *根據題意,處理字符串, 得出字符串所表示的數字的位數, 用numC表示,然後按順序讀取字
 *符,將字符轉化成數字,然後用pow(10, numC - 1)得出, 同時用SumC來累加這個字符串的
 *每個字符得出的數的結果.最後, 根據flag = 1為負數, 把SumC轉換成-SumC,然後兩個數的
 *Sum分別相加,得出結果. 再用一個數組來儲存這個結果,最後統一輸出,這樣做事為了符合
 *題列的要求.
*/

 

代碼及詳細注釋:

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cmath>
 4 using namespace std;
 5 
 6 
 7 int deal(char c[14])
 8 {
 9     int SumC = 0;/*把傳入的字符化成整形數,用SumC來表示.*/
10     int cc = strlen(c);/*數組c[]的長度*/
11     int flag1 = 0;    /*標記變化,用來後面用到的判斷正負用的*/
12     int CC = cc;/*看下面的if, 首先, 如果有'-'的, 那麼把整個字符串去掉的長度減1,因為負號不是數字*/
13 
14     if (c[0] == '-')/*如果是字符串第一是負號*/
15     {
16         CC -= 1; /*長度減1,也就是說把它當成正數處理, 比如 -432 長度為4, 處理後為 432, 長度為3*/
17         flag1 = 1; /*長度減少後, 用flag記錄該數是負數的,flag由0變為1*/
18     }
19         
20     int numC = CC - CC / 4;/*用numC表示位數, 比如 234,567,890 有11個字符, 去掉逗號, 一共有 11 - 11/4 = 9個字符*/
21         
22     for (int i = 0; i < cc; i++)/*對整個字符串進行掃描, 此時包括了'-',注意這裡是小寫的cc,即原字符串*/
23     {
24         if (c[i] >= 48 && c[i] <= 57) /*如果是ascll碼這個范圍的,即對應字符'0'到'9'*/
25         {
26             SumC += int(c[i] - 48) * pow(10, numC - 1); /*把傳入的字符化成整形數,用SumC來表示.累加, 何為numC - 1,比如123,numC表示3位數,那麼該數是10^2的, 所以用10^(numC - 1)次方 */
27                                                         
28             numC--;//位數減1
29         }    
30     }
31 
32     if (flag1 == 1) //如果有'-',flag1 變成了1,那麼把這個數按負數處理.
33     {
34         SumC *= -1; //變成 -SumC
35     }
36     return SumC;//返回處理結果
37 }
38 
39 int main()
40 {
41     int zhu[100];//限制了測試組數
42     int u = 0;//根據輸入,測試u組
43     char a[14];//因爲範圍是+-10^9,最多有14個字符
44     char b[14];
45     while (cin >> a >> b)
46     {
47         zhu[u] = deal(a) + deal(b);/*調用函數,傳入數據處理,最後相加,得出結果, 存入數組中,為後面統一輸出*/
48         u++;
49     }
50     for (int y = 0; y < u; y++)
51     {
52         cout << zhu[y] << endl;//輸入結束後, 統一輸出答案
53     }
54     return 0;    
55 }


運行結果:

 


swap(&a,&b)與swap(a,b)在以下題目中有什不同?

一樓說的不對

你的程序我試過了 在這裡
cin>>a>>b;
swap(a,b); 這個是對的 swap(&a,&b) 是錯的

因為
void swap(int *a,int *b)
是指針 所以需要傳值

而傳地址的話 相當於 *a *b 指向地址 然後把*a *b 指向的地址值交換了一下

所以後面輸出 數值不變

當傳地址時 結果如下

3 4
0012FF7C 0012FF78
3 4
Press any key to continue

#include<iostream>
using namespace std;
void swap(int *a,int *b)
{
int *temp;
cout<<a<<" "<<b<<endl;
temp=a;
a=b;
b=temp;
}
void main()
{
int a,b;
cin>>a>>b;
swap(&a,&b);
cout<<a<<" "<<b<<endl;
}

有疑問請追問 滿意記得采納

在傳地址時 是調用的你寫的swap

在傳值時 是調用的系統的 inline 函數 swap

傳值時你把你寫的swap 注釋掉也不影響

傳值時單步調試時不進你寫的swap
 

ACM經典題目 A+B 指教

scanf的返回值有後面的參數決定

scanf("%d%d", &a, &b);

如果a和b都被成功讀入,那麼scanf的返回值就是2

如果只有a被成功讀入,返回值為1

如果a和b都未被成功讀入,返回值為0

如果遇到錯誤或遇到end of file,返回值為EOF。

且返回值為int型.

均用:

sign=scanf("%d %d",&a,&b);
printf("%d %d\n",a,b);
printf("%d\n",sign);

驗證了

但是輸入“a X”的時候 輸出的sign為0

什麼時候輸出EOF? 在stdio.h中 宏定義為-1

按照說明,scanf函數只有在第一個參數為NULL(空指針)的情況下,才可能返回EOF,否則,返回成功格式化並賦值的參數個數(>=0)。

End Of File,在電腦的術語縮寫通常為 EOF,在作業系統決定資料源無更多的資料可讀取。
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved