目录
1.字符判断(switch语句)【问题描述】从键盘任意输入一个字符,编程判断该字符是数字字符、大写字符、小写字符、空格还是其他字符。请用switch语句实现。 【输入形式】一个字符 【输出形式】是哪种类型的字符 【样例输入】A 【样例输出】Uppercase Letter 【样例说明】输出时,用Digit、Uppercase Letter、Lowercase Letter、Blank Space、Others分别代表数字字符、大写字符、小写字符、空格、其他字符 【注意】如果用char ch; cin>>ch; 是无法准确判断空格字符的。请换用其他的输入方式,例如scanf或getchar或cin.get等 【提示】如果输入 + - ( ) 中的任意一个,请试一试你的答案是否正确吧 |
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
char ch;
ch=getchar();
if(ch>='A'&& ch<='Z')cout<<"Uppercase Letter"<<endl;
else if(ch>='a'&&ch<='z')cout<<"Lowercase Letter"<<endl;
else if(ch>='0'&&ch<='9')cout<<"Digit"<<endl;
else if(ch>=' ')cout<<"Blank Space"<<endl;
else
cout<<"Others"<<endl;
return 0;
}
2.简单约瑟夫环问题(循环)
【问题描述】有n个人围成一圈,按顺序从1到n编号。从第1个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
【输入形式】考虑如下两种情况:
(1)如果n超出"n must be a natural number less than 10000",则打印"n is out of range of valid values.",其中n应该用如上输入的具体的n数值代替。
(2)如果n是有效范围的数值,则打印"Last No. is:",然后直接在冒号后面输出最后留下来的人的编号。
【运行时的输入输出样例1】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):5
Last No. is:4
【运行时的输入输出样例2】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):100000
100000 is out of range of valid values.
【测试数据】一共9组测试数据:1,2,3,10,0,90,10000,10001,-1,其中0,-1,10001都不是有效范围的值。
【注意】目前还未学习数组,请大家用迭代法实现
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//用队列进行解决比较方便,
//1初始时把所有元素都放到队列
//2.队头前两个元素放到队尾,把队头出栈
//3.重复步骤2,直到队列只剩一个元素
queue<int> Q;
void func(int n){
for(int i=1;i<=n;i++){
Q.push(i);
}
while(!Q.empty()){
for(int i=0;i<=2;i++)
{
Q.push(Q.front());//将队首元素放到队尾去
Q.pop();
}
cout<<Q.front()<<" ";
Q.pop();
}
}
int main()
{
int n;
cin>>n;
if(n>=1&&n<=10000)func(n);
else cout<<n<<"is out of range of valid values."<<endl;
return 0;
}
3.三角形类型(if语句)
【问题描述】根据输入的三角形的三边判断该三角形的类型:等边三角形、等腰三角形;直角三角形、锐角三角形和钝角三角形。
【输入形式】三角形的三条边
【输出形式】三角形的类型。注意:若不能构成三角形,请输出“ERROR”。等边、等腰、直角、锐角、钝角三角形分别输出:Equilateral Triangle,Isosceles Triangle,Right Triangle,Acute Triangle,Obtuse Triangle。
【样例输入】3 3 4
【样例输出】
Isosceles Triangle
Acute Triangle
下面的三角形逻辑判断还有点问题。感兴趣的可以具体进行改写
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c;
cin>>a;
cin>>b;
if(a>b)swap(a,b);
cin>>c;
if(c<b)swap(b,c);
if(b<a) swap(a,b);
cout<<a<<" "<<b<<" "<<c<<endl;
//经过上面的步骤
if(a+b>c){
if(a==b==c){
cout<<"Equilateral Triangle"<<endl;
}
if(a==b&&a!=c)cout<<"Isosceles Triangle"<<endl;
if(a*a+b*b==c*c )
cout<<"Right Triangle"<<endl;
if(a*a+b*b<c*c)//较短的两边的平方和《较长的平方和,则为锐角三角形
cout<<"Acute Triangle"<<endl;
if(a*a+b*b>c*c)
cout<<"Obtuse Triangle"<<endl;
}
return 0;
}
4.【问题描述】实现一个简单的菜单程序,运行时显示:“Menu:A(dd) D(elete) S(ort) Q(uit),Select one:”提示用户输入。A表示增加;D表示删除,S表示排序,Q表示退出。输入为A、D、S时分别提示“数据已经增加、删除、排序。”,输入为Q时程序结束。循环结构和选择结构套用。其中,选择结构要求用switch语句完成。
【输入形式】单个字符
【输出形式】字符对应的操作结果
【样例输入】
A
Q
【样例输出】
Menu: A(dd) D(elete) S(ort) Q(uit),Select one:
Added.
Menu: A(dd) D(elete) S(ort) Q(uit),Select one:
Quit.
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
char ch;
cout<<"Menu:A(dd) D(elete) S(ort) Q(uit),Select one:"<<endl;
ch=getchar();
switch (ch){
case 'A':cout<<"Add"<<endl;break;
case 'D':cout<<"Delete"<<endl;break;
case 'S':cout<<"Sort"<<endl;break;
case 'Q':cout<<"Quit"<<endl;break;
}
return 0;
}
5.m!+n!之和(while)
【问题描述】输入2 个正整数m 和n,计算m!+n!。
【输入形式】从键盘输入正整数m和正整数n。
【输入输出样例1】(下划线部分表示输入)
Enter m: 3
Enter n: 8
3!+8!=40326
【样例说明】
输入提示符后要加一个空格。其中冒号后要加一个且只能一个空格。
输出语句的加号和等号两边无空格。
英文字母区分大小写。必须严格按样例输入输出。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//计算n的阶乘
//这里用的是递归,如果时间有限制的话,就用数组正向来计算。
long int fun(int n)
{
if(n==0||n==1)return 1;
return n*fun(n-1);
}
int main()
{
long int m,n;
cout<<"Enter m: ";
cin>>m;
cout<<"Enter n: ";
cin>>n;
cout<<m<<"!+"<<n<<"!="<<fun(m)+fun(n);
return 0;
}
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//这里用的方法是用字符串
//当然应该要用整数求余数的方法
int main()
{
string n;
cin>>n;
int len=n.length();
for(int i=0;i<len;i++)
{
cout<<n[i]<<" ";
}
cout<<endl;
cout<<len<<endl;
}
6.数的分解(if语句)【问题描述】给一个不多于5位的正整数,要求:分别打印出每一位数字,并求出它是几位数。 【输入形式】输入一个不多于5 位的正整数。 【输出形式】从高位到低位输出各位的数字,再输出总的位数。 【样例输入】6408 【样例输出】 6 4 0 8 4 【样例说明】有可能是1位数,也有可能是5位数哦~,比如25478 【评分标准】5组测试数据,全对则得分。请注意每个数字之间有空格,总位数在第二行显示。 |
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
string n;
cin>>n;
int len=n.length();
for(int i=0;i<len;i++)
{
cout<<n[i]<<" ";
}
cout<<endl;
cout<<len<<endl;
}
7.求字符串s的任意子串。(字符数组参数)
编写一个函数,用来求字符串s的任意子串。函数原型为
void SubString ( char s[ ] , int start , int len , char d[ ] ) ;
其中s是原字符串,d用来存放s中从第start个字符开始( 1≤start≤strlen(s) ),长度为len的子串。以下是完成此项工作的程序,请在计算机上调试程序以补足其中的空格。
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//下面的代码自己简单写的
void SubString(char s[],int start,int len,char d[])
{
int j=0;
for(int i=start;i<start+len;i++)
{
d[j]=s[i];
cout<<d[j];
j++;
}
}
int main()
{
char s[30]="Yang MingXiang";
char d[30];
SubString(s,5,9,d);
return 0;
}
8.子串问题(函数、字符串、指针)
【问题描述】
请编写函数统计子串Substr在母串Str中出现的次数。函数原型如下,返回值为出现的次数:
int Count(char *Str, char *Substr);
【样例说明】第一行为母串、第二行为子串
【样例输入】出现的次数
abcbcbc
bcb
【样例输出】
2
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int Count(char *Str,char *Substr)
{
int len1,len2,cnt=0;
len1=strlen(Str);
len2=strlen(Substr);
int i,j,k;
for(i=0;i<=len1-len2;i++)
{
for(j=0,k=i;j<len2&&Str[k]==Substr[j];j++,k++);
if(j==len2)cnt++;
}
return cnt;
}
int main()
{
//char *Str="abcbcbcb";//len1=7
//char *Substr="bcb";//len2=3
char Str[30];
char Substr[30];
gets(Str);
gets(Substr);
cout<<Count(Str,Substr);
return 0;
}
9.字符串中的数字(字符串、循环)
【问题描述】输入一个字符串,有数字内和非数字字符。如:a123x456 17960?302tab5876,将其中连续的数字作为一个整数,依次存放到一个数组a中。例如,123存放在a[0],456存放在a[1]......统计共有多少个整数,并输出这些整数。输入串中含有空格,可以用cin.getline(str,30,'\n')接收串,其中str是char str[50]。
【样例输入】
a123x456 17960?302tab5876
【样例输出】
5
123 456 17960 302 5876
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
void func(string s)
{
int flag;//0表示当前不是数字
int len=s.length();
string nums[100];
int cnt=0;
for(int i=0;i<len;)
{
if(s[i]>='0'&&s[i]<='9')
{
while(s[i]>='0'&&s[i]<='9')
{
nums[cnt]+=s[i];
i++;
}
cnt++;
}
i++;
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
{
cout<<nums[i]<<" ";
}
}
int main()
{
string s;
getline(cin,s);//注意有空格时要用getline
func(s);
return 0;
}
10.大整数相加(字符串、数组、循环)
【问题描述】请编程实现超长位数的大整数的加法运算。
【提示】定义字符数组接收待相加的两个超长位数的大整数,然后进行单个字符与字符之间的相加,举例如下:
char x[1000],y[1000]; int sum, carry;
sum=carry+x[i]-'0'+y[i]-'0';
其中carry代表进位。
亦可使用结构体实现。
下面是用结构体的,有的实例不对,不知道哪里出问题l,希望大佬帮看下
#include <bits/stdc++.h>
using namespace std;
struct bigInt{
int d[1000];
int len;
};
bigInt change(char str[])
{
bigInt bI;
bI.len=strlen(str);
for(int i=0;i<1000;++i)bI.d[i]=0;
for(int i=0;i<bI.len;++i)
bI.d[i]=str[bI.len-i-1]-'0';
return bI;
}
//大整数加法
bigInt add(bigInt a,bigInt b)
{
bigInt c;
c.len=0;
int carry=0;
for(int i=0;i<a.len||i<b.len;++i)
{
int temp=a.d[i]+b.d[i]+carry;
c.d[c.len]=temp%10;
c.len++;
carry=temp/10;
}
if(carry!=0)
{
c.d[c.len]=carry;
c.len++;
}
return c;
}
//大整数减法
bigInt Sub(bigInt a,bigInt b)
{
bigInt c;
c.len=0;
for(int i=0;i<a.len||i<b.len;++i)
{
if(a.d[i]<b.d[i])
{
a.d[i+1]--;
a.d[i]+=10;
}
c.d[c.len]=a.d[i]-b.d[i];
c.len++;
}
while(c.len-1>=1&& c.d[c.len-1]==0)
c.len--;//除去高位的0 ,且至少保留一位0
return c;
}
int main() {
char str_a[1000],str_b[1000];
gets(str_a);
gets(str_b);
bigInt a=change(str_a);
bigInt b=change(str_b);
bigInt c=Sub(a,b);
bigInt e=add(a,b);
cout<<"a-b= ";
for(int i=0;i<c.len;i++)
cout<<c.d[i];
cout<<endl;
cout<<"a+b= ";
for(int i=e.len-1;i>=0;i--)
cout<<e.d[i];
cout<<endl;
}
下面使用string的方法,直接将大整数存为字符串,将字符串翻转进行相加。AC
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//翻转
void func(string a,string b)
{
int len_a=a.length(),len_b=b.length();
string result="";
int carry=0;//向高位的进位,一定要弄初值,开始没弄初值做好久没有结果
if(len_a>len_b)
{
swap(len_a,len_b);
swap(a,b);//保证a中放的短的string
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int sum;
for( int i=0;i<len_a;i++)
{
int a_=a[i]-'0';//有时多定义几个变量,可以让结果简便,不然表达式太复杂,本题还需注意是字符还是字符串。
int b_=b[i]-'0';
sum=a_+b_+carry;
result+=(sum%10+'0');
carry=sum/10;
}
for( int i=len_a;i<len_b;i++)
{
sum=b[i]-'0'+carry;
result+=(sum%10+'0');
carry=sum/10;
}
if(carry==1)result=result+'1';
reverse(result.begin(),result.end());
cout<<result;
}
int main()
{
string a,b;
cin>>a>>b;//注意有空格时要用getline
func(a,b);
return 0;
}
11. | 11两个单链表的合并【问题描述】定义两个同种单向链表(结点中包含一个整型数和一个指向本结点类型的指针),两个链表中的数据都已经从小到大排好序了,请编制程序,合并这两个有序链表。 【输入形式】两个链表的数据,以0作为输入结束 【输出形式】合并后的数据,重复的数据请删除。 【样例输入】 1 3 5 7 9 0 1 2 3 4 5 5 8 12 0 1 2 3 4 5 7 8 9 12 |
---|
6. | 12链表的插入排序【问题描述】建立一个5结点的单向链表,每个结点包括:学号、姓名、性别、年龄。对其进行排序,采用插入排序法,按学号从小到大进行排列。 1004 zhang f 18 1002 wang m 19 1003 zheng f 19 1001 wu m 20 1005 deng m 19 1001 wu m 20 1002 wang m 19 1003 zheng f 19 1004 zhang f 18 1005 deng m 19 【样例输入】 1002 wu m 20 1001 wang m 19 1004 zheng f 19 1005 zhang f 18 1003 deng m 19 【样例输出】 1001 wang m 19 1002 wu m 20 1003 deng m 19 1004 zheng f 19 1005 zhang f 18 |
---|
13.二进制加法
利用了翻转的方法
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//二进制加法
//11 + 101
// 11+1
//翻转
void func(string a,string b)
{
int len_a=a.length(),len_b=b.length();
string result="";
int carry=0;//向高位的进位,一定要弄初值,开始没弄初值做好久没有结果
if(len_a>len_b)
{
swap(len_a,len_b);
swap(a,b);//保证a中放的短的string
}
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int sum;
for( int i=0;i<len_a;i++)
{
int a_=a[i]-'0';//有时多定义几个变量,可以让结果简便,不然表达式太复杂,本题还需注意是字符还是字符串。
int b_=b[i]-'0';
sum=a_+b_+carry;
result+=(sum%2+'0');
carry=sum/2;
}
for( int i=len_a;i<len_b;i++)
{
sum=b[i]-'0'+carry;
result+=(sum%2+'0');
carry=sum/2;
}
if(carry==1)result=result+'1';
reverse(result.begin(),result.end());
cout<<result;
}
int main()
{
string a,b;
cin>>a>>b;//注意有空格时要用getline
func(a,b);
return 0;
}
14.约数的个数
如果用暴力的方法会超时,所以在求约数时用到根号n,当i*i<n,约数成对出现的,如果当前的i是约数,cnt+=2;
再判断i*i==num ? cnt++
本题输入n个数用while不断输入,就不用单独的数组来存储数据了。
#include <iostream>
using namespace std;
void func(int n)
{
int cnt=0;//包括自身
int i;
for( i=1;i*i<n;i++)//用暴力算法会超时,约数个数都是成对出现的,
{
if(n%i==0)cnt+=2;
}
if(i*i==n)cnt++;//比自己平方大的数只有一个或者没有
cout<<cnt<<endl;
}
int main() {
int n,num;
while(cin>>n)
{
for(int i=0;i<n;i++)
{cin>>num;
func(num);
}
}
return 0;
}
// 64 位输出请用 printf("%lld")