随手附上一些代码,未必是最优解,仅供参考。
加密四位数
【问题描述】
输入一个四位数,将其加密后输出。方法是将该数每一位的数字加9,然后除以10取余作为该位上的新数字,最后将千位上的数字和十位上的数字互换,组成加密后的新四位数。 (顺序结构,不考虑特殊情况)
【样例输入】
1368
【样例输出】
5207
【样例说明】
1368的四位数字分别是1、3、6、8,对每个数字加9后对10求余的结果为0、2、5、7,交换千位和十位数字后为5、2、0、7,加密后的新四位数为5207
思路
逐个拆开数字,然后加上9再对10取余。
也可以不用像我写那么麻烦,合在一起一气呵成。
#include<iostream>
using namespace std;
int main()
{int n,a,b,c,d;cin>>n;a=n%10;n/=10;b=n%10;n/=10;c=n%10;n/=10;d=n;a=(a+9)%10;b=(b+9)%10;c=(c+9)%10;d=(d+9)%10;swap(b,d);cout<<d<<c<<b<<a;
}
分段函数16
【问题描述】有一分段函数如下,请编写程序,输入x值,输出y值。
【样例输入1】
-5.5
【样例输出1】
-6.20789
【样例输入2】
0.5
【样例输出2】
1.91619
【样例输入3】
5.5
【样例输出3】
13.1757
思路
选择结构的考查,注意运算细节即可。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{double x,y;cin>>x;if(x<-2) y=x-1/sqrt(1+2*sin(x)*sin(x));else if(x<1) y=1+1/(x*x+sin(2*x));else y=sqrt(abs(3-x*x*x))+cos(x*x);cout<<y<<endl;
}
阶乘和数
【问题描述】
一个正整数如果等于组成它的各位数字的阶乘之和,则该正整数称为阶乘和数。例如正整数145,1!+4!+5!等于145,因此145就是一个阶乘和数。输入一个正整数,计算它的各位数字的阶乘之和,并判断它是否是一个阶乘和数。注意:输入的正整数,以及组成它的各位数字的阶乘之和都不会超过int类型的表示范围,并且输入的正整数的最高位不为0。
【输入形式】
从控制台输入一个正整数。
【输出形式】
第一行输出各位数字的阶乘之和;第二行输出字符串“yes”或“no”,表明该正整数是否是阶乘和数。
【输入样例1】
145
【输出样例1】
145
yes
【输入样例2】
1400
【输出样例2】
27
no
【输入样例3】
4
【输出样例3】
24
no
【样例说明】
样例1中输入的正整数为145,组成它的各位数字的阶乘之和为145,所以145为阶乘和数。样例2中输入的正整数为1400,组成它的各位数字的阶乘之和为25,所以1400不是阶乘和数。样例3中输入的正整数为4,组成它的只有一位数字,其阶乘为24,也不是阶乘和数。
思路
先拆分数字,再计算阶乘,最后求和
#include<iostream>
using namespace std;
int main()
{int n,jc,sum=0,t;cin>>n;t=n;while(t){jc=1;for(int i=2;i<=t%10;i++)jc*=i;sum+=jc;t/=10;}cout<<sum<<endl;sum==n?cout<<"yes"<<endl:cout<<"no"<<endl;
}
数组元素调整顺序
【问题描述】
输入n个数存放到数组a中,把数组a中的最大值放在b[0]中,把a数组中的最小值放在b[1]中;再把a数组元素中的次大值放在b[2]中,把a数组元素中的次小值放在b[3]中;其余以此类推。例如:若a所指数组中的数据最初排列为:1、4、2、3、9、6、5、8、7,则按规则移动后,b数组数据排列为: 9、1、8、2、7、3、6、4、5。其中n为a数组中数据的个数。
【输入形式】
输入分2行:第一行为n的值,第二行为n个数
【输出形式】
输出排列后的结果
【样例输入】
9
1 4 2 3 9 6 5 8 7
【样例输出】
9 1 8 2 7 3 6 4 5
思路
观察。
每隔一个放一个,奇数项单调递减,偶数项单调递增
本人采用了一种比较麻烦的方法。对于偶数项而言,通过计算,发现了原下标x和新下标y有这样的关系:
y=-2x+2n-1
然后就写了思考量相对大的代码
#include<iostream>
using namespace std;
const int N=100002;
int a[N],b[N],n;
int main()
{cin>>n;for(int i=0;i<n;i++) cin>>a[i];for(int i=0;i<n;i++)for(int j=i;j<n;j++)if(a[i]<a[j])swap(a[i],a[j]);for(int i=0;i<(n+1)/2;i++)b[2*i]=a[i];for(int i=(n+1)/2;i<n;i++)b[(-2)*i+(2*n-1)]=a[i];for(int i=0;i<n;i++) cout<<b[i]<<" ";
}
然后又有大佬提供了一个更简单的代码,思考量也小。以下是大佬的程序:
十六进制转十进制
【问题描述】
编写程序,输入一个十六进制的数,如果输入的不是十六进制,则输出NO,否则输出对应的十进制值。 注:十六进制数由0-9、A-F(字母大小写不限)组成,其中A-F代表10-15;十六进制转成十进制的方法是按权展开法,即每一位上的数值乘以该位的权值,最后相加。比如1A2b,共4位数,每一位的权值(从高位到低位)分别为16的三次方、16的二次方、16的一次方、16的零次方,各位上的数字乘以该位的权值即为116的三次方+1016的二次方+216的一次方+1116的零次方,转换结果为6699
【输入形式】
一个字符串
【输出形式】
一个整型数
【样例输入1】
1A2b
【样例输出1】
6699
【样例输入2】
15G9
【样例输出2】
NO
思路
先判断数字是否合法,字母是否用A~F,再利用位权进行运算。
我想吐槽,这个测试平台添加了cstring头文件还是用不了strupr和strlwr
#include<iostream>
#include<cstring>
using namespace std;
const int N=100002;
char c[N];
int main()
{cin>>c;for(int i=0;i<strlen(c);i++)if((c[i]>='0'&&c[i]<='9')||(c[i]>='A'&&c[i]<='F')||(c[i]>='a'&&c[i]<='f')) continue;else{cout<<"NO";return 0;}long long sum=0,num,wq=1;for(int i=strlen(c)-1;i>=0;i--){if(c[i]>='0'&&c[i]<='9')num=c[i]-'0';else switch(c[i]){case 'A':case 'a':num=10;break;case 'B':case 'b':num=11;break;case 'C':case 'c':num=12;break;case 'D':case 'd':num=13;break;case 'E':case 'e':num=14;break;case 'F':case 'f':num=15;break;}sum+=num*wq;wq*=16;}cout<<sum<<endl;
}
大佬的更简洁的程序如下:
最大数与第一个数交换
【问题描述】
编写函数,功能是将数组中的最大数与第一个数交换,并计算数组元素的平均值。例如输入5个元素3、4、1、5、2,将最大数5和第一个数3的位置交换后得到5、4、1、3、2,平均值为3。要求输入输出均在主函数中完成。
【输入形式】
输入分两行,第一行为n的值,第二行为n个数
【输出形式】
输出分两行,第一行为交换后数组n个元素的值,第二行为平均值。
【样例输入】
5
5 3 2 1 7
【样例输出】
7 3 2 1 5
3.6
思路
写函数,交换,求平均。
我的程序有点繁琐,就是找最大的时候把最大值也用一个变量保存了下来。
#include<iostream>
#include<cstring>
using namespace std;
const int N=100002;
double fun(int n,int f[])
{int maxx=-1,maxp=0,sum=0;for(int i=0;i<n;i++){sum+=f[i];if(f[i]>maxx){maxx=f[i];maxp=i;}}swap(f[0],f[maxp]);return (double)sum/n;
}
int main()
{int a[N],n;cin>>n;for(int i=0;i<n;i++) cin>>a[i];double ave=fun(n,a);for(int i=0;i<n;i++) cout<<a[i]<<" ";cout<<endl<<ave;
}
其实没有问最大值,那就只要知道下标就行了,下面这也是一个大佬的程序,更简洁。
#include<iostream>
using namespace std;
double han(int a[],int n)
{int i,max=0,t;double b=0;for(i=0;i<n;i++)b=b+a[i];b=b*1.0/n;for(i=0;i<n;i++){if(a[i]>a[max]){max=i;}t=a[max];a[max]=a[0];a[0]=t;}return b;
}
int main()
{int a[999],n,i;double s;cin>>n;for(i=0;i<n;i++)cin>>a[i];s=han(a,n);for(i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl<<s;return 0;
}
最后,祝大家都能取得令人满意的成绩!
留下点赞或者评论再走呗~