C++学习(二)
1.插入排序
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { //N数字<=10000,元素个数 //第二行各个元素值 //第三个表示插入的值 int *a,N; cin >>N; a = new int[N]; for(int i = 0;i < N;i++) cin >>a[i]; //do something int insertValue; cin >> insertValue; if(a[0] > insertValue) cout <<insertValue<<" "; for(int i = 0;i < N;i++) { cout <<a[i]<<" "; if(a[i] < insertValue && a[i + 1] > insertValue) cout <<insertValue<<" "; } if(a[N-1] < insertValue) cout <<insertValue<<" "; cout <<endl; system("pause"); return 0; }
2.统计字符
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <ctype.h> using namespace std; int main() { char c; int alpha = 0,number = 0,space = 0,other = 0; while((c = getchar()) != '\n') { if(isalpha(c)) alpha++; else if(isdigit(c)) number++; else if(c == 32) space++; else other++; } cout <<"letter="<<alpha<<endl; cout <<"space="<<space<<endl; cout <<"digit="<<number<<endl; cout <<"other="<<other<<endl; system("pause"); return 0; }
3.稀疏数组,数组的第一部分用于记录原数组的列数和行数及元素的使用个数,第二部分为原数组非零元素的行数、列数、元素值
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { //set n*n array int row,col,s = 0; cin >>row>>col; int **a = new int*[row]; for(int i = 0;i < row;i++) a[i] = new int[col]; //set value for(int i = 0;i < row;i++) { for(int j = 0;j < col;j++) { cin >> a[i][j]; if(a[i][j] != 0) s++; } } cout <<row<<" "<<col<<" "<<s<<endl; //print for(int i = 0;i < row;i++) { for(int j = 0;j < col;j++) { if(a[i][j] != 0) cout <<i<<" "<<j<<" "<<a[i][j]<<endl; } } system("pause"); return 0; }
4.c++标识符和java标识符的转换
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <string.h> #include <ctype.h> using namespace std; int main() { char s1[100],s2[100]; char c; int r,t = 0; bool upper = false,line = false,firstA = false,isLineRepeat = false; while((c = getchar()) != '\n') { if(isupper(c)) upper = true; if(c == 95) line = true; if(islower(c) && t == 0) firstA = true; if(t > 0 && c == 95 && s1[t - 1] == 95) isLineRepeat = true; s1[t++] = c; } int s1_len = strlen(s1); if(firstA== true && line == false && upper == true) r = 1; else if(firstA == true && isLineRepeat == false && upper == false) r = 2; else { cout <<"error!"<<endl; system("pause"); return 0; } if(r == 1) { cout <<"java to c++:"<<endl; int j = 0; for(int i = 0;s1[i] != '\0';i++,j++) { if(islower(s1[i])) s2[j] = s1[i]; else { s2[j++] = '_'; s2[j] = s1[i]; } } s2[j] = '\0'; } else if(r == 2) { cout <<"c++ to java:"<<endl; int j = 0; for(int i = 0;s1[i] != '\0';i++) { if(islower(s1[i]) ) s2[j++] = s1[i]; else s2[j++] = s1[++i] - 32; } s2[j] = '\0'; } //print for(int i = 0;s2[i] != '\0';i++) cout <<s2[i]; cout <<endl; system("pause"); return 0; }
5.5位数(找出前两位数、后两位数、中间数能被6整除)
①穷举法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { int coutLine = 0; for(int i = 10000;i <= 99999;i++) { int a = i/1000; int b = i/100%10; int c = i - a*1000 - b*100; if(a%6==0 && b%6==0 && c%6==0) { cout <<i<<" "; coutLine++; if(coutLine%10==0) cout <<endl; } } cout <<coutLine; system("pause"); return 0; }
②找规律
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { int coutLine = 0; for(int a = 12;a <= 96;a+=6) for(int b = 0;b <= 6;b+=6) for(int c = 0;c <= 96;c+=6) { if(coutLine % 10 == 0) cout<<endl; if(c < 10) cout<<a<<b<<"0"<<c<<" "; else cout <<a<<b<<c<<" "; coutLine++; } cout <<endl<<coutLine; system("pause"); return 0; }
6.计算n!的末尾有几个零
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { int n; cin >>n; int i = n,t = 0; while(i >= 5) { i = i/ 5; t = t+i; } cout <<t<<endl; system("pause"); return 0; }
7.最大子序列和
①方法一
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; #define N 35000 int a[N + 1]; int main() { int n; cin >>n; for(int i = 0;i < n;i++) cin >>a[i]; int maxValue = 0; for(int i = 0;i < n;i++) { int sum = 0; for(int j = 0;j < n;j++) { sum += a[j]; if(sum > maxValue) maxValue = sum; } } cout <<maxValue<<endl; return 0; }
②方法二
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; #define N 35000 int a[N + 1]; int main() { //联机算法 int n; cin >>n; for(int i = 0;i < n;i++) cin >>a[i]; int nowSum = 0; int maxSum = 0; for(int i = 0;i < n;i++) { nowSum += a[i]; if(nowSum > maxSum) maxSum = nowSum; else if(nowSum < 0) nowSum = 0; } cout <<maxSum<<endl; return 0; }
8.抢椅子算楚谁最后第一
①方法一 时间复杂难度略高
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #define N 100 using namespace std; int a[N + 1],c = 0; int main() { int m,n; cin >>m>>n; for(int i =1;i<=m;i++) a[i] = 1; int countNumber = 0; int k = 1; while(countNumber < m -1) { for(int i = 1;i <= m;i++) { if(a[i] == 1) { if(k % n == 0) { k = 0; a[i] = 0; //cout <<i<<" 0"<<endl; countNumber++; //cout <<countNumber<<endl; } k++; } } } for(int i = 1;i <=m;i++) { if(a[i] == 1) cout <<i<<endl; } system("pause"); return 0; }
②方法二
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #define N 100 using namespace std; int a[N + 1]; int main() { int m,n; cin >>m>>n; for(int i = 1;i <= m -1;i++) a[i] = i+1; a[m] = 1; int countNumber = 0; int k = m; for(int i = 1;i <= m;i++) { for(int countNumber = 0;countNumber < n - 1;countNumber++) k = a[k]; a[k] = a[a[k]]; //指向后一个值 } cout <<k<<endl; system("pause"); return 0; }
③方法三 按规律得出公式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { int m,n,ans = 0; cin >>m>>n; for(int i= 2;i<=m;i++) ans = (ans + n)%i; cout <<ans + 1; system("pause"); return 0; }
9.shlqsh数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int main() { int t1,t2; cin >>t1>>t2; int ans1 = 0,ans2 = 0; for(int i = 1;i < t1;i++) ans1 += (t1 - 1)/i; for(int j = 1;j <= t2;j++) ans2 += t2/j; cout <<ans2 - ans1<<endl; system("pause"); return 0; }
10.判断素数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <math.h> using namespace std; void isPrime(int x) { int t = sqrt(x); for(int i = 2;i <= t;i++) { if(!(x % i)) { cout <<x<<"不是素数!"<<endl; return; } } cout <<x<<"是素数!"<<endl; } int main() { int a; cin >>a; if(a > 2) isPrime(a); else cout <<"error!"<<endl; system("pause"); return 0; }
11.哥德巴赫猜想(验证两千以内的正偶数能够分解为两个素数的和)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
include <iostream> #include <math.h> using namespace std; int isPrime(int x) { if(x == 2) return 1; if(!(x % 2)) return 0; int t = sqrt(x); for(int i = 3;i <= t;i++) { if(!(x % i)) return 0; } return 1; } int main() { for(int i = 4;i <= 2000;i+=2) { for(int j = 2;j < i;j++) { if(isPrime(j)) //a是素数 { if(isPrime(i - j)) //a-j是素数 { cout <<j<<"+"<<i-j<<"="<<i<<endl; break; } } } } system("pause"); return 0; }
12.逆序数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <math.h> using namespace std; int reverseNum(int x) { double t = 0; if(x >= 10) { cout <<x%10; reverseNum(x/10); } else cout <<x<<endl; } int main() { int a; cin >>a; reverseNum(a); system("pause"); return 0; }
13.数字转字符串
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; void intToString(int x) { int t; if((t = x/10)!= 0) intToString(x/10); putchar(x%10 + 48); } int main() { int a; cin >>a; if(a < 0) { putchar('-'); a = -a; } intToString(a); system("pause"); return 0; }
14.递归打印等边三角形
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; void trangle(char c,int n) { if(n > 0) { cout <<c; trangle(c,n-1); } } int main() { int n; cin >>n; for(int i = 1;i<=n;i++) { trangle(' ',n - i); trangle('*',2*i-1); cout<<endl; } system("pause"); return 0; }