此題不僅僅是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 }
運行結果:
一樓說的不對
你的程序我試過了 在這裡
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
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,在作業系統決定資料源無更多的資料可讀取。