目录
1.A+B问题
#include<bits/stdc++.h>
using namespace std;
int main(){
int A,B;
cin>>A>>B;
cout<<A+B<<endl;
return 0;
}
2.数列排序
给定一个长度为n的数列,将这个数列按从小到大的顺序排列。
输出一行,按从小到大的顺序输出排序后的数列。
- 冒泡排序法:基本原理是两两比较待排序数据的大小 ,当两个数据的次序不满足顺序条件时即进行交换,反之,则保持不变,这样每次最小(或最大)的结点就像气泡一样浮到序列的最前位置。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int a[n];
for(int i=0; i<n;i++){
cin>>a[i];
}
//COMPARE
int temp=0;
for(int i=0; i<n-1; i++){//-1防止数组角标越界
for(int j=0; j<n-i-1; j++){
if(a[j+1]<a[j]) {
//temp=a[j+1];
//a[j+1]=a[j];
//a[j]=temp;
swap(a[j+1],a[j]);
}
}
}
for(int i=0; i<n;i++){
cout<<a[i]<<" " ;
}
return 0;
}
3.十六进制转八进制
给定n个十六进制正整数,输出它们对应的八进制数。
- 十六进制:0~9 A~F 0000~1111
- 八进制:0~7 000~111
C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
strcpy(Arry_eight,Arrx.c_str());
#include<bits/stdc++.h>
using namespace std;
//二进制-八进制
void transform_8(string Arrx) {
int n;
n=Arrx.length();
//检查是否需要补0
if(n%3==1) Arrx = "00"+Arrx;
else if(n%3==2) Arrx = "0"+Arrx;
//更新长度
n=Arrx.length();
char Arry_eight[n];
//C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest。
strcpy(Arry_eight,Arrx.c_str());
int i,j;
//八进制位数
i=n/3;
//字符数组对应的八进制位数,数组从0开始计数
j=i-1;
//数组前三均为0,则八进制此处为0,不在记录
if(Arry_eight[0]=='0'&&Arry_eight[1]=='0'&&Arry_eight[2]=='0') {
j--;
i--;
}
//八进制的个数为i
char Arrx_eight[i];
//3位一组
int x, y, z;
x=n-1;
y=n-2;
z=n-3;
for(int k= i; k>0; k--){
if(Arry_eight[z]=='0'&&Arry_eight[y]=='0'&&Arry_eight[x]=='0') Arrx_eight[j]='0';
else if(Arry_eight[z]=='0'&&Arry_eight[y]=='0'&&Arry_eight[x]=='1') Arrx_eight[j]='1';
else if(Arry_eight[z]=='0'&&Arry_eight[y]=='1'&&Arry_eight[x]=='0') Arrx_eight[j]='2';
else if(Arry_eight[z]=='0'&&Arry_eight[y]=='1'&&Arry_eight[x]=='1') Arrx_eight[j]='3';
else if(Arry_eight[z]=='1'&&Arry_eight[y]=='0'&&Arry_eight[x]=='0') Arrx_eight[j]='4';
else if(Arry_eight[z]=='1'&&Arry_eight[y]=='0'&&Arry_eight[x]=='1') Arrx_eight[j]='5';
else if(Arry_eight[z]=='1'&&Arry_eight[y]=='1'&&Arry_eight[x]=='0') Arrx_eight[j]='6';
else if(Arry_eight[z]=='1'&&Arry_eight[y]=='1'&&Arry_eight[x]=='1') Arrx_eight[j]='7';
j--;
x-=3;
y-=3;
z-=3;
}
for(int p=0; p<i; p++){
cout<<Arrx_eight[p];
}
cout<<endl;
}
//十六进制-二进制
void transform_2(char num[], int n){
string Arry[n];
string Arrx;
for(int i=0; i<n; i++){
//如果为数字
if(num[i]=='0'||num[i]=='1'||num[i]=='2'||num[i]=='3'||num[i]=='4'
||num[i]=='5'||num[i]=='6'||num[i]=='7'||num[i]=='8'||num[i]=='9'){
if(num[i]=='0' && i!=0) Arry[i]="0000";
if(num[i]=='1') Arry[i]="0001";
if(num[i]=='2') Arry[i]="0010";
if(num[i]=='3') Arry[i]="0011";
if(num[i]=='4') Arry[i]="0100";
if(num[i]=='5') Arry[i]="0101";
if(num[i]=='6') Arry[i]="0110";
if(num[i]=='7') Arry[i]="0111";
if(num[i]=='8') Arry[i]="1000";
if(num[i]=='9') Arry[i]="1001";
}
else if(num[i]=='A' || num[i]=='a') Arry[i]="1010";
else if(num[i]=='B' || num[i]=='b') Arry[i]="1011";
else if(num[i]=='C' || num[i]=='c') Arry[i]="1100";
else if(num[i]=='D' || num[i]=='d') Arry[i]="1101";
else if(num[i]=='E' || num[i]=='e') Arry[i]="1110";
else if(num[i]=='F' || num[i]=='f') Arry[i]="1111";
}
//字符串合并
for(int i=0; i<n; i++) {
Arrx += Arry[i];
}
//转换成八进制
transform_8(Arrx);
}
int main(){
int n;
//n行
cin>>n;
string aa[n];
//输入字符串
for(int i=0; i<n; i++){
cin>>aa[i];
}
//将每个字符串转成字符数组进行定位
for(int i=0; i<n; i++){
string a=aa[i];
char c[aa[i].length()];
//把字符串转换成字符指针,string转换成char* ,然后再将字符指针转换到字符数组C里面
strcpy(c,a.c_str());
//转换成二进制
transform_2(c,aa[i].length());
}
return 0;
}
4.十六进制转十进制
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
- 不超过八位十六进制,如果用来存储答案的是int类型的话,输入样例FFFFFFFF,答案是错误的,因为FFFFFFFF对应的十进制数是4294967295大于了int的范围,所以以答案所需要使用的数据类型是长整数类型。
#include<bits/stdc++.h>
using namespace std;
//转换为二进制
void transform_2(char num[], int n){
string Arry[n];
string Arrx;
for(int i=0; i<n; i++){
//如果为数字
if(num[i]=='0'||num[i]=='1'||num[i]=='2'||num[i]=='3'||num[i]=='4'
||num[i]=='5'||num[i]=='6'||num[i]=='7'||num[i]=='8'||num[i]=='9'){
if(num[i]=='0' && i!=0) Arry[i]="0000";
if(num[i]=='1') Arry[i]="0001";
if(num[i]=='2') Arry[i]="0010";
if(num[i]=='3') Arry[i]="0011";
if(num[i]=='4') Arry[i]="0100";
if(num[i]=='5') Arry[i]="0101";
if(num[i]=='6') Arry[i]="0110";
if(num[i]=='7') Arry[i]="0111";
if(num[i]=='8') Arry[i]="1000";
if(num[i]=='9') Arry[i]="1001";
}
else if(num[i]=='A' || num[i]=='a') Arry[i]="1010";
else if(num[i]=='B' || num[i]=='b') Arry[i]="1011";
else if(num[i]=='C' || num[i]=='c') Arry[i]="1100";
else if(num[i]=='D' || num[i]=='d') Arry[i]="1101";
else if(num[i]=='E' || num[i]=='e') Arry[i]="1110";
else if(num[i]=='F' || num[i]=='f') Arry[i]="1111";
}
//字符串合并
for(int i=0; i<n; i++) {
Arrx += Arry[i];
}
int len=Arrx.length();
long long res=0; //重要说明,即注意事项
for(int i=0; i<len;i++){
if(Arrx[i]=='1'){
res+=pow(2,len-1-i);
}
}
cout<<res;
}
int main(){
string s;
cin>>s;
char c[s.length()];
strcpy(c,s.c_str());
transform_2(c,s.length());
return 0;
}
5.十进制转十六进制
十六进制数是在程序设计时经常要使用到的一种整数的表示方式。0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
给出一个非负整数,将它表示成十六进制的形式。
#include <iostream>
using namespace std;
int main()
{
int a;
cin>>a;
int yu=a%16; //取余数
int shang=a/16; //取商
char result[200];
int count=0;
while(shang!=0) //商大于等于0,也就是这个数比16大,17是‘11’(16进制)
{
switch(yu)
{
case 0: result[count]='0';break;
case 1: result[count]='1';break;
case 2: result[count]='2';break;
case 3: result[count]='3';break;
case 4: result[count]='4';break;
case 5: result[count]='5';break;
case 6: result[count]='6';break;
case 7: result[count]='7';break;
case 8: result[count]='8';break;
case 9: result[count]='9';break;
case 10: result[count]='A';break;
case 11: result[count]='B';break;
case 12: result[count]='C';break;
case 13: result[count]='D';break;
case 14: result[count]='E';break;
case 15: result[count]='F';break;
}
count++;
yu=shang%16;//余数
shang=shang/16;
}
if(shang==0)
{
switch(yu)
{
case 0: result[count]='0';break;
case 1: result[count]='1';break;
case 2: result[count]='2';break;
case 3: result[count]='3';break;
case 4: result[count]='4';break;
case 5: result[count]='5';break;
case 6: result[count]='6';break;
case 7: result[count]='7';break;
case 8: result[count]='8';break;
case 9: result[count]='9';break;
case 10: result[count]='A';break;
case 11: result[count]='B';break;
case 12: result[count]='C';break;
case 13: result[count]='D';break;
case 14: result[count]='E';break;
case 15: result[count]='F';break;
}
}
for(int i=count;i>=0;i--)
{
cout<<result[i];
}
}
6.特殊回文数
123321是一个非常特殊的数,它从左边读和从右边读是一样的。
输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n 。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
//5位
for(int a=1; a<=9;a++){
for(int b=0; b<=9; b++){
for(int c=0; c<=9; c++){
if(a+b+c+b+a==n){
cout<<a<<b<<c<<b<<a<<endl;
}
}
}
}
//6位
for(int a=1; a<=9;a++){
for(int b=0; b<=9; b++){
for(int c=0; c<=9; c++){
if(a+b+c+c+b+a==n){
cout<<a<<b<<c<<c<<b<<a<<endl;
}
}
}
}
return 0;
}
7.回文数
1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
for(int a=1; a<=9;a++){
for(int b=0; b<=9; b++){
if(a*1000+b*100+b*10+a<=9999){
cout<<a<<b<<b<<a<<endl;
}
}
}
return 0;
}
8.特殊的数字
153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。编程求所有满足这种条件的三位十进制数。
#include <bits/stdc++.h>
using namespace std;
int main()
{
for(int a=1; a<=9;a++){
for(int b=0; b<=9; b++){
for(int c=0; c<=9; c++){
if(a*100+b*10+c==a*a*a+b*b*b+c*c*c){
cout<<a*100+b*10+c<<endl;
}
}
}
}
return 0;
}
9.杨辉三角形
杨辉三角形又称Pascal三角形,它的第i+1行是(a+b)i的展开式的系数。
它的一个重要性质是:三角形中的每个数字等于它两肩上的数字相加。
下面给出了杨辉三角形的前4行:
1
1 1
1 2 1
1 3 3 1
给出n,输出它的前n行。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int lst[n][n+2];
memset(lst, 0 ,sizeof lst); //memset的作用一般就是用来初始化数组例如用来将a数组全部归零
lst[0][1]=1;
for(int i=1; i<n; i++){
for(int j=1; j<n+1; j++){
lst[i][j]=lst[i-1][j]+lst[i-1][j-1];
}
}
for(int i=0; i<n; i++){
for(int j=1; j<=i+1; j++){
cout<<lst[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
10.查找整数
给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int num[n];
for(int i=0; i<n; i++){
cin>>num[i];
}
int a;
cin>>a;
for(int i=0; i<n; i++){
if(num[i]==a){
cout<<i+1<<endl;
break;
}else if((num[i]!=a) && (i==n-1)){
cout<<"-1"<<endl;
}
}
return 0;
}
11.数列特征
给出n个数,找出这n个数的最大值,最小值,和。
sort函数的使用!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int num[n];
for(int i=0; i<n; i++){
cin>>num[i];
}
sort(num, num+n, greater<int>());
cout<<num[0]<<endl;
cout<<num[n-1]<<endl;
int sum=0;
for(int i=0; i<n; i++){
sum=sum+num[i];
}
cout<<sum<<endl;
return 0;
}
12.字母图形
利用字母可以组成一些美丽的图形,下面给出了一个例子:
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>n>>m;
string str1="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
for(int i=0; i<n; i++){
string res="";
//第一部分
for(int j=i; j>i-m; j--) {
if(j<0) break;
res+=str1[j];
}
//第二部分
for(int k=1; k<m-i;k++){
res+=str1[k];
}
cout<<res<<endl;
}
return 0;
}
13.01字串
对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是:
00000
00001
00010
00011
00100
请按从小到大的顺序输出这32种01串。
可能有所复杂,实际就是转二进制再补0!
#include <bits/stdc++.h>
using namespace std;
void transform_to_2(int x){
int yushu=x%2; //余数
int shang=x/2; //商
char result[32];
int count=0;
while(shang!=0){
switch(yushu){
case 0: result[count]='0'; break;
case 1: result[count]='1'; break;
}
count++;
yushu=shang%2;
shang=shang/2;
}
if(shang==0){
switch(yushu){
case 0: result[count]='0'; break;
case 1: result[count]='1'; break;
}
}
int n=count;
if(n==0) cout<<"0000";
if(n==1) cout<<"000";
else if(n==2) cout<<"00";
else if(n==3) cout<<"0";
for(int i=count; i>=0; i--)
{
cout<<result[i];
}
}
int main()
{
for(int i=0; i<32; i++){
transform_to_2(i);
cout<<endl;
}
return 0;
}
14.闰年判断
闰年口诀:四年一闰·,百年不闰,四百年又闰!
#include <bits/stdc++.h>
using namespace std;
int main()
{
int y;
cin>>y;
if((y%400==0)||(y%4==0&&y%100!=0)){
cout<<"yes";
}else{cout<<"no";}
return 0;
}
15.Fibonacci数列
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
分别求余,相加再求余!
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin>>n;
long long a[n];
a[0]=1;
a[1]=1;
for(int i=2; i<n; i++){
a[i]=a[i-1]%10007+a[i-2]%10007;
// a[i]=a[i]%10007;
// cout<<a[i]<<endl;
}
cout<< a[n-1]%10007 <<endl;
return 0;
}
16.圆的面积
给定圆的半径r,求圆的面积。
PI的表示方式!可以用计算器辅助!
#include <bits/stdc++.h>
using namespace std;
//const double PI=3.14159265358979323846; //要取更精确的值,否则数据大时计算结果有误
int main()
{
int r;
cin>>r;
double PI=atan(1.0)*4;
double s=PI*r*r;
cout << fixed << setprecision(7);
cout<<s;
// printf("%.7f", s);
return 0;
}
17.序列求和
求1+2+3+...+n的值。
- (首项+末项)*项数/2
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;
cin>>n;
long long sum=0;
sum = (1+n)*n/2;
cout<<sum;
return 0;
}
18.阶乘计算
19.高精度加法
补充:
- int x=(a[alen-1-i])-'0';
- a[alen-1-i]表示从数组a的最后一个元素开始,向前数第i个元素。
- (a[alen-1-i])-'0'表示将数组a中的字符型数字转换成整型数字。这是因为在计算机中,字符型数字的存储是按照ASCII码来存储的,'0'的ASCII码是48,因此将字符型数字减去'0'的ASCII码,就可以得到对应的整型数字。