七、基础题目练习与C++例题
基础题目练习
T1: 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。
#include <iostream> using namespace std; int main() { int score; cout<<"请输入你的成绩"<<endl; cin>>score; if (score>=90) { cout<<"成绩等级为A"<<endl; } else if(score>=60) { cout<<"成绩等级为B"<<endl; } else { cout<<"成绩等级为C"<<endl; } }
T2: 从键盘输入一个大于0的数字保存到int型变量count中,表示int型数组的个数,假设为count,然后从键盘读入count个数字,保存到一个int型数组中,最后,输出数组中所有元素的和及平均值。
public class T2 { public static void main(String[] args) { Scanner sc= new Scanner(System.in); int count=sc.nextInt(); int [] array=new int[count]; for (int i = 0; i <count ; i++) { array[i]=sc.nextInt(); } for (int i = 0; i <count ; i++) { if(suShu(array[i])){ System.out.println(" "+array[i]); } } } public static boolean suShu(int s){ for (int i = 2; i <=s ; i++) { if(s%i==0){ return false; } } return true; } }
T3: 输入两个正整数m和n,求其最大公约数和最小公倍数。
public class T3 { public static void main(String args[]){ gcdlcm a =new gcdlcm(); System.out.println("两数的最大公约数是:"+a.gcd(10, 16)); System.out.println("两数的最小公倍数是:"+a.lcm(16, 10)); } } class gcdlcm{ int gcd(int m,int n){ if(m<n){ //判断数值较大的数 int temp=n; n=m; m=temp; } if(m%n==0){ return n; } else{ m%=n; return gcd(m,n); } } int lcm(int m,int n){ int i=1; if(m<n){ //判断数值较大的数 int temp=n; n=m; m=temp; } int lcm=m; while(lcm%n!=0){ lcm=m*i; i++; } return lcm; } }
T4: 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:
153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。
public class T4 { public static void main(String args[]){ int a,sum; //表示100~999 int i,j,k;//分别表示百位、十位、各位 for(a=100;a<=999;a++){ i=a/100; j=(a-i*100)/10; k=a-i*100-j*10; sum=i*i*i+j*j*j+k*k*k; //java的运算符,立方要这样写,写成i^3这样,运算不出来 //如果遇到高次的话可以使用循环算出来 if(sum==a) { System.out.println(sum); } }
T5: 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一 对兔子,假如兔子都不死,问每个月的兔子总数为多少?
思路:第一个月只有一对兔子,第二个月还是只有一对兔子,第三个月,就有两对了,第四个月3对,第五个月5对,第六个月8对,第七个月是13对,这样规律就出来了。
public class T5{ public static void main(String args[]){ //i是表示月份的,这里计算了36个月,也就是三年,兔子的数量 int i; long arr[]=new long[36]; //这个数组时用来计算每月有兔子的对数 arr[0]=arr[1]=1; System.out.println("第1个月有兔子1对"+", "+"总数是"+2); System.out.println("第2个月有兔子1对"+", "+"总数是"+2); for(i=2;i<=35;i++){ arr[i]=arr[i-1]+arr[i-2]; System.out.println("第"+i+"个月有兔子"+arr[i]+"对"+", "+"总数是"+2*arr[i]); //规律是 每个数字都是前面两个数字之和 } } }
C++常见例题
1、冒泡排序
for(int i=0;i<n-1;i++) { for (int j=0;j<n-1-i;j++) { if(a[j]<a[j+1]) a[j]^=a[j+1]^=a[j]^=a[j+1]; //相邻元素比较交换 } }
2、sort
头文件 #include < algorithm >
sort函数若没有第三个参数,默认实现的是从小到大
less<数据类型>() //从小到大排序 greater<数据类型>() //从大到小排序
利用sort函数实现对字符的排序
#include<iostream> #include<algorithm> using namespace std; int main(){ char a[11]="asdfghjklk"; for(int i=0;i<10;i++) cout<<a[i]<<endl; sort(a,a+10,greater<char>()); for(int i=0;i<10;i++) cout<<a[i]<<endl; return 0; }
3、10转16进制
#include<iostream>using namespace std; char exchange(int n){ switch(n){ case 0: return '0';break; case 1: return '1';break; case 2: return '2';break; case 3: return '3';break; case 4: return '4';break; case 5: return '5';break; case 6: return '6';break; case 7: return '7';break; case 8: return '8';break; case 9: return '9';break; case 10: return 'A';break; case 11:return 'B';break; case 12:return 'C';break; case 13:return 'D';break; case 14: return 'E';break; case 15:return 'F';break;}} int main(){ int m,note,i=0,s=0; cin>>m; note=m; while(m/16!=0){ i++; m=m/16; } char a[i]; while(note/16!=0){ a[s]=exchange(note%16); s++; note=note/16; } a[i]=exchange(note); for(int j=i;j>=0;j--){ cout<<a[j]; } cout<<endl; return 0; }
4、原封不动输出:当成字符串 string
#include < iomanip> 要保留n位小数: cout<<fixed<<setprecision(n)<<;
#include < iomanip> 宽度设置函数 setw(n)
setw()默认的是输出右对齐,而当你想要左对齐时,便需要另外添加setiosflags(ios::left)来实现输出左对齐。
以特殊符号占位,下面就以补 @为例,用特殊符号占位就需要setfill(‘x’)—这里的’x’指的是字符,代码如下:cout<<setw(6)<<setfill(“@”)<<1234 @@1234
4.判断素数
bool sb(int n) {
int i;
for(i = 2; i <= sqrt(n); i++) {
if((n % i) == 0) return false;
}
return true;
}
5、任意整数拿到各个数位的值
#include <iostream> using namespace std; void sb(int n){ if(n>9){ sb(n/10); //每次调用时将输入的数最后一位去掉 cout<<n%10<<" "; //每次调用都打印出第一位 }else cout<<n<<" ";//直接打印小于10的所有数 } int main(){ int n=0; cin>>n; sb(n); cout<<endl; return 0; }
6、闰年判断问题
闰年:能被4整除但不能被100整除,或可以被400整除
if(y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
阶乘
long Fac(int n){ if (n == 0) return 1; else return n * Fac(n - 1); }
7、输出0~255的二进制数
#include <iostream> #include <bitset> using namespace std; int main(){ bitset<8>b; for(int i = 0; i < 256; i++){ b = i; cout<<b<<endl; } return 0; }
8、递归解法
斐波那契数列
int f(int n){
// 1.先写递归结束条件
if(n <= 2){
return 1;
}
// 2.接着写等价关系式
return f(n-1) + f(n - 2);
}
9、汉诺塔问题
#include <iostream> using namespace std; long count = 0;//记录移动的次数 void hanoi(int n,char a,char b,char c) { //n个盘子,a移动到c,用b做临时塔 if (1 == n){ cout<<"第"<<++count<<"次: "<<a<<"塔--->"<<c<<"塔"<<endl; }else{ hanoi(n-1,a,c,b);//递归调用,a移到b,c做临时塔 cout<<"第"<<++count<<"次: "<<a<<"塔--->"<<c<<"塔"<<endl; hanoi(n-1,b,a,c); } } int main(){ int n; cout<<"输入汉诺塔圆盘的数量: "; cin>>n; hanoi(n,'A','B','C'); return 0; }
10、分鱼问题
#include<iostream> using namespace std; int fish(int n, int x){ if((x-1)%5 == 0){ if(n == 1) return 1; else return fish(n-1, (x-1)/5*4); } return 0; //x不是符合题意的解,返回0 } int main(){ int i=0, flag=0, x; do{ i=i+1; x=i*5+1; //x最小值为6,以后每次增加5 if(fish(5, x)){ //将x传入分鱼递归函数进行检验 flag=1; //找到第一个符合题意的x则置标志位为1 cout<<"五个人合伙捕到的鱼总数为"<<x; } } while(!flag); //未找到符合题意的x,继续循环,否则退出循环 return 0; }
描述:输入两个正整数,a和b,求出a/b的结果中小数点后的20位。
输入:两个正整数,a和b
输出:注意行尾输出回车、注意最后一位数字四舍五入。
#include <iostream> #include <cmath> using namespace std; int main(){ int a, b, i; cin >> a >> b; a = a % b; for(i = 0; i < 19; i ++){ a = a * 10; cout << a / b; a = a - a / b * b; } a = a * 10; i = a / b; a = a - a / b * b; a = a * 10; if(a > 4) cout << (i + 1) << endl; else cout << i << endl; return 0; }
请定义一个结构体以描述学生信息,包括姓名、学号、年龄、性别、 手机号码,其中年龄为 int 型值,性别为 char 型值,其余成员均为长 度小于 20 的字符串(不含空格)。 输入 n(n < 20)及 n 个学生的信息,再输入待查找学生的手机号, 如果找到该学生,输出其信息,各项间用制表符分隔,否则输出 Not Found。
#include <iostream> #include <string.h> using namespace std; struct student{ char name[27]; char no[27]; int age; char gender; char phone[27]; }; int main(){ student a[27]; int n,i; char phone[27]; cin>>n; for(i = 0; i < n; i ++) cin >> a[i].name >> a[i].no >> a[i].age >> a[i].gender >> a[i].phone; cin >> phone; for(i = 0; i < n; i ++) if(!strcmp(a[i].phone, phone)) { cout << a[i].name << "\t" << a[i].no << "\t" << a[i].age << "\t" << a[i].gender << "\t"<< a[i].phone << endl; return 0; } cout << "Not Found" << endl; }
请定义一个结构体以描述学生信息,包括姓名、学号、年龄、性别、 手机号码,其中年龄为 int 值,性别为 char 值,其余成员均为长度小 于 20 的字符串(不含空格)。 输入 n(n < 20)及 n 个学生的信息,输出按年龄降序排列后的学 生信息,年龄相等的话,按姓名升序输出。
#include <iostream> #include <string.h> #include <algorithm> using namespace std; struct student{ char name[27]; char no[27]; int age; char gender; char phone[27]; }a[27]; bool cmp(student a, student b) { if(a.age == b.age){ if(strcmp(a.name, b.name) < 0) return true; else return false; } return a.age > b.age; } int main(){ int n, i; cin >> n; for(i = 0; i < n; i ++) { cin >> a[i].name >> a[i].no >> a[i].age >> a[i].gender >> a[i].phone; } sort(a, a + n, cmp); for(i = 0; i < n; i ++) { cout << a[i].name << "\t" << a[i].no << "\t" << a[i].age << "\t" << a[i].gender << "\t" << a[i].phone << endl; } return 0; }
输入今天的年月日,输出昨天的日期。
#include <iostream> #include <cmath> using namespace std; int day[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; bool f(int a) { if(a % 4 == 0 && a % 100 != 0 || a % 400 == 0) return true; return false; } int main(){ int y, m, d; 6 cin >> y >> m >> d; if(d == 1){ if(m == 1) cout << y-1 << " 12 31" << endl; else if(m == 3){ if(f(y)) cout << y << " 2 29" << endl; else cout << y << " 2 28" << endl; } else cout << y << " " << m - 1 << " " << day[m-1] << endl; } else cout << y << " " << m << " " << d - 1 << endl; return 0; }
给出相邻两个素数a、b的差值c,请输出a b,其中保证a、b为所有可能的解中最小的。例如,如果输入的c值为2,则应输出3 5回车,而不是5 7回车。注意行尾输出回车。c值小于100,且题目保证一定有解
#include <iostream> using namespace std; bool p(int a) { for(int i=2;i<a;i++) { if(a%i==0) return false; } return true; } int main() { int c,x=0; cin>>c; int a=2,b=3; for(int i = a;;i ++) { if(a - b == c) { cout << b << " " << a << endl; return 0; } if(p(i)) { b = a; a = i; } } return 0; }
编写程序,计算一个字符串中出现频率最高的字母字符。如果有两个以上的字母出现的次数相同,且同为最高频率,输出字典序小的字母。注意,大写字母的ASCII值小于小写字母。
#include <stdio.h>#include <string.h>#include <iostream> #include <iomanip>#include <cmath>#include <string.h> using namespace std; bool f(char a) { if(a >= 'a' && a <= 'z') return true; return false; } bool g(char a) { if(a >= 'A' && a <= 'Z') return true; return false; } int main() { char a[1007]; int i, b[52] = {0}, max = -1; cin.get(a, 1007); for(i = 0; a[i]; i ++) { if(f(a[i])) { b[a[i] - 'a' + 26] ++; } else if(g(a[i])) { b[a[i] - 'A'] ++; } } for(i = 0; i < 52; i ++) { if(b[i] > max) max = b[i]; } for(i = 0; i < 52; i ++){ if(b[i] == max) { if(i < 26) { cout << (char)('A' + i) << endl; break; } else { cout << (char)('a' + i - 26) << endl; break; } } } return 0; }
编写程序,计算一个字符串中出现频率最高的字母字符。如果有两个以上的字母出现的次数相同,且同为最高频率,输出在原字符串中最先出现的字母。
#include <stdio.h>#include <string.h>#include <iostream> #include <iomanip>#include <cmath>#include <string.h> using namespace std; bool f(char a) { if(a >= 'a' && a <= 'z') return true; return false; }bool g(char a) { if(a >= 'A' && a <= 'Z') return true; return false; } int main() { char a[1007]; int i, b[52] = {0}, max = -1; cin.get(a, 1007); for(i = 0; a[i]; i ++) { if(f(a[i])) { b[a[i] - 'a' + 26] ++;} else if(g(a[i])) {b[a[i] - 'A'] ++;} } for(i = 0; i < 52; i ++) { if(b[i] > max) max = b[i]; } for(i = 0; a[i]; i ++) { if(f(a[i]) && b[a[i] - 'a' + 26] == max) { cout << a[i] << endl; break; } else if(g(a[i]) && b[a[i] - 'A'] == max) { cout << a[i] << endl; break; }} return 0;}