C++ OJ在线编程常见输入输出技巧与示例
一直在leetcode上刷題,發現牛客上答題都需要自己解決輸入問題。這里記一下遇到的一些方式。
純記錄,有點亂。
1.將一行按字符輸入的數據轉換成數據
下面這個注意輸入是負數
vector<int> s;string str;getline(cin, str);int temp = 0;for (int i = 0; i != str.size(); ++i){if (isdigit(str[i])){temp =temp* 10 + (str[i] - 48);}else{s.push_back(temp);temp = 0;}if (i == (str.size() - 1)) {s.push_back(temp);}}2.單獨輸入幾個數
cin>>n>>a>>b;3.第一個數是數字,后面是連續字符,比如第一個輸入是為了告訴你有幾個數,后面是需要處理的字符串。
char s[100500]; int n; cin>>n>>s+1;4.C語言連續多個輸入的判斷方式:
while(~scanf("%d%d",&n,&m)){ } //如果成功,該函數返回成功匹配和賦值的個數。如果到達文件末尾或發生讀錯誤,則返回 EOF。 //所以~scanf表示 只要輸入對了就是1.5.C語言創建動態數組 輸入兩行,第一行為一個數組,數字之間用空格隔開,第二行表示數組的長度。
#include <stdio.h> #include<ctype.h> int main() {int N;int num[10000];int j = 0;do { //因為第一個是數字 第二個才是空格,所以用do 不然會丟失第一個數scanf_s("%d", &num[j++]);} while (getchar() != '\n');scanf_s("%d", &N);for (int i = 0; i < j; i++) {printf("%d ", num[i]);}return 0; }一般題目要輸入一個長度為n的數組(n需要輸入),因為其長度未知,我們常規方法是建立一個足夠長的數組,如a[100],a[10000000]等。
這樣處理的缺點是會消耗大量不必要的內存。
所以可以用動態分配內存的方式創建數組。
1. malloc函數,原型:void?*malloc(unsigned?int?num_bytes)。是申請一片空間,如int?*p?=?(int?*)malloc(1*sizeof(int)),如果編譯器默認int為4字節存儲的話,那么計算結果是4Byte,一次申請一個4Byte的連續空間,并將空間基地址強制轉換為int類型,賦值給指針p,此時申請的內存值是不確定的。
2. calloc函數,原型:void *calloc(size_t n, size_t size);? ?calloc函數會將申請的空間初始化為0。由于給每一個空間都要初始化值,那必然效率較malloc要低.
3.realloc函數,原型:void?realloc(void?*ptr,?size_t?new_Size);與上面兩個有本質的區別,?用于對動態內存進行擴容(及已申請的動態空間不夠使用,需要進行空間擴容操作),ptr為指向原來空間基址的指針,?new_size為接下來需要擴充容量的大小。
? ? ? ? 如果size較小,原來申請的動態內存后面還有空余內存,系統將直接在原內存空間后面擴容,并返回原動態空間基地址;
????????如果size較大,原來申請的空間后面沒有足夠大的空間擴容,系統將重新申請一塊new_Size*sizeof(int)的內存,并把原來空間的內容拷貝過去,原來空間free;
????????如果size非常大,系統內存申請失敗,返回NULL,原來的內存不會釋放。
注意:如果擴容后的內存空間較原空間小,將會出現數據丟失,如果直接realloc(p,?0);相當于free(p)
也就是說realloc相當于重新申請了一塊new_Size*sizeof(int)大小的內存,根據實際情況決定是在原來基礎上擴容還是換個基地址。所以申請后數組首地址可能發生改變。
#include <stdio.h> #include "malloc.h" #include<ctype.h> int main() {int N;int j = 0;int *num = (int *)malloc(1 * sizeof(int));//數組*stack,malloc(size)是申請一個空間 do{scanf_s("%d", &num[j++]);num = (int *)realloc(num, sizeof(int)*(j+1));//realloc(address,size)向address上面追加size個空間 } while (getchar() != '\n');scanf_s("%d", &N);for (int i = 0; i < j; i++) {printf("%d ", num[i]);} return 0; }6.OJ在線編程常見輸入輸出練習場
6.1 計算a+b(多組數據)
計算a+b
打開以下鏈接可以查看正確的代碼
輸入描述:
輸入包括兩個正整數a,b(1 <= a, b <= 10^9),輸入數據包括多組。輸出描述:
輸出a+b的結果輸入例子1:
1 5 10 20輸出例子1:
6 30 #include <iostream> using namespace std;int main() {int a;int b;while(cin>>a>>b){cout<<a+b<<endl;}return 0; }6.2 計算a+b(輸入包括數組個數)
計算a+b
輸入描述:
輸入第一行包括一個數據組數t(1 <= t <= 100) 接下來每行包括兩個正整數a,b(1 <= a, b <= 10^9)輸出描述:
輸出a+b的結果輸入例子1:
2 1 5 10 20輸出例子1:
6 30 #include<iostream>using namespace std;int main() {int t;cin>>t;int a,b;while(t--){cin>>a>>b;cout<<a+b<<endl;}return 0; }6.3 計算a+b(有結束標志)
計算a+b
輸入描述:
輸入包括兩個正整數a,b(1 <= a, b <= 10^9),輸入數據有多組, 如果輸入為0 0則結束輸入輸出描述:
輸出a+b的結果輸入例子1:
1 5 10 20 0 0輸出例子1:
6 30 #include<bits/stdc++.h> using namespace std; int main(){int a = 0, b = 0;while(1){cin >> a >> b;if(!(a || b)) break;cout << a + b << endl;}return 0; }6.4?計算一系列數的和(有結束標志)
計算一系列數的和
輸入描述:
輸入數據包括多組。 每組數據一行,每行的第一個整數為整數的個數n(1 <= n <= 100), n為0的時候結束輸入。 接下來n個正整數,即需要求和的每個正整數。輸出描述:
每組數據輸出求和的結果輸入例子1:
4 1 2 3 4 5 1 2 3 4 5 0輸出例子1:
10 15 #include<bits/stdc++.h> using namespace std; int main(){int input = 0, output = 0, N = 0;while(1){cin >> N;if(N == 0) break;output = 0;while(N--){cin >> input;output += input;}cout << output << endl;}return 0; }6.5?計算一系列數的和
計算一系列數的和
輸入描述:
輸入的第一行包括一個正整數t(1 <= t <= 100), 表示數據組數。 接下來t行, 每行一組數據。 每行的第一個整數為整數的個數n(1 <= n <= 100)。 接下來n個正整數, 即需要求和的每個正整數。輸出描述:
每組數據輸出求和的結果輸入例子1:
2 4 1 2 3 4 5 1 2 3 4 5輸出例子1:
10 15 #include<bits/stdc++.h> using namespace std; int main(){int N = 0, input = 0, output = 0, n = 0;cin >> N;while(N--){cin >> n;output = 0;while(n--){cin >> input;output += input;}cout << output << endl;}return 0; }6.6?計算一系列數的和
計算一系列數的和
輸入描述:
輸入數據有多組, 每行表示一組輸入數據。 每行的第一個整數為整數的個數n(1 <= n <= 100)。 接下來n個正整數, 即需要求和的每個正整數。輸出描述:
每組數據輸出求和的結果輸入例子1:
4 1 2 3 4 5 1 2 3 4 5輸出例子1:
10 15 #include<bits/stdc++.h> using namespace std; int main(){int N = 0, input = 0, output = 0;while(cin >> N){output = 0;while(N--){cin >> input;output += input;}cout << output << endl;}return 0; }6.7?計算一系列數的和
計算一系列數的和
輸入描述:
輸入數據有多組, 每行表示一組輸入數據。每行不定有n個整數,空格隔開。(1 <= n <= 100)。輸出描述:
每組數據輸出求和的結果輸入例子1:
1 2 3 4 5 0 0 0 0 0輸出例子1:
6 9 0 #include<bits/stdc++.h> using namespace std; int main(){int input = 0, output = 0;while(cin >> input){output += input;if(getchar() == '\n'){cout << output << endl;output = 0;}}return 0; }6.8?對輸入的字符串進行排序后輸出
對輸入的字符串進行排序后輸出
輸入描述:
輸入有兩行,第一行n第二行是n個空格隔開的字符串輸出描述:
輸出一行排序后的字符串,空格隔開,無結尾空格輸入例子1:
5 c d a bb e輸出例子1:
a bb c d e #include<bits/stdc++.h> using namespace std; int main(){int N = 0;string str;vector<string> res;cin >> N;while(N--){cin >> str;res.push_back(str);}sort(res.begin(), res.end());for(auto& s : res)cout << s << " ";cout << endl;return 0; }6.9?對輸入的字符串進行排序后輸出
對輸入的字符串進行排序后輸出
輸入描述:
多個測試用例,每個測試用例一行。每行通過空格隔開,有n個字符,n<100輸出描述:
對于每組測試用例,輸出一行排序過的字符串,每個字符串通過空格隔開輸入例子1:
a c bb f dddd nowcoder輸出例子1:
a bb c dddd f nowcoder #include<bits/stdc++.h> using namespace std; int main(){string str;vector<string> res;while(cin >> str){res.push_back(str);if(getchar() == '\n'){sort(res.begin(), res.end());for(auto& s:res)cout << s << " ";cout << endl;vector<string>().swap(res);}}return 0; }6.10?對輸入的字符串進行排序后輸出
對輸入的字符串進行排序后輸出
輸入描述:
多個測試用例,每個測試用例一行。 每行通過,隔開,有n個字符,n<100輸出描述:
對于每組用例輸出一行排序后的字符串,用','隔開,無結尾空格輸入例子1:
a,c,bb f,dddd nowcoder輸出例子1:
a,bb,c dddd,f nowcoder #include<bits/stdc++.h> using namespace std; int main(){vector<string> res;string input, str;while (getline(cin, input)) {for (int i = 0; i < input.size(); i++) {if (input[i] == ',') {res.push_back(str);string().swap(str);}elsestr += input[i];}if (!str.empty()) {res.push_back(str);string().swap(str);}sort(res.begin(), res.end());for (int i = 0; i < res.size(); i++) {if (i != res.size() - 1)cout << res[i] << ",";elsecout << res[i] << endl;}vector<string>().swap(res);}return 0; }6.11 輸出每組數的和
輸入描述:
輸入有多組測試用例,每組空格隔開兩個整數輸出描述:
對于每組數據輸出一行兩個整數的和輸入例子1:
1 1輸出例子1:
2 #include <iostream> using namespace std; int main(){long a,b;while(cin>>a>>b){cout<<a+b<<endl;}return 0; }總結
以上是生活随笔為你收集整理的C++ OJ在线编程常见输入输出技巧与示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中调用C++函数
- 下一篇: linux防火墙策略文件夹,Linux防