中国大学mooc高级语言程序设计地址:https://www.icourse163.org/course/JLU-62001
输入:一个整数m和一个整数n。
输出:函数f的值。
样例:输入 4 2 输出 6
#include
int t(int x){
int sum;
sum=x;
while(x>1){
sum*=(x-1);
x--;}
return sum;
}
int main(){
int m,n,l;
scanf("%d %d",&m,&n);
if(m<n&&m>0&&n>0)printf("0");
else if(m==n&&m>0&&n>0)printf("1");
else if(m>n&&m>0&&n>0){
l=m-n;
printf("%d",t(m)/t(l)/t(n));
}
else printf("-1");
return 0;
}
暴力模拟就完事(但是如果m,n值很大会tle),可以参考杨辉三角优化算法。
问题描述:编写函数,求任意四位自然数的逆序数,例如5432就是2345的逆序数。
输入:任意一个整数
输出:如果输入的不是四位自然数,则输出0;否则输出对应的逆序数。
样例1:输入 12 输出 0
样例2:输入 654 输出456
#include
int main(){
long a,i[4],t;
scanf("%ld",&a);
if(a<1000||a>9999)printf("0");
else{
for(t=1;t<=4;t++){
i[t]=a%10;
a/=10;
}
for(t=1;t<=4;t++){
printf("%ld",i[t]);
}
}
return 0;
}
还是那套求每位数的方法。这里注意跟对应的位数比较。
问题描述:编写程序,把给定长度为10的整数数组中所有0元素全部移到后面,且所有非0元素的顺序不变。
输入:从键盘随机输入十个整数,作为数组a的元素。
输出:已将所有0元素串到后面的整数数组a的所有元素,各元素间无间隔字符。
样例:输入 0 1 1 0 0 0 1 3 2 0 输出1113200000
#include
int main(){
long a[9],i,t=0;
for(i=0;i<=9;i++)
scanf("%ld",&a[i]);
for(i=0;i<=9;i++){
if(a[i]!=0)printf("%ld",a[i]);
else t++;
}
while(t>0){
printf("0");
t--;}
return 0;
}
先输出非零元素,然后用计数器计零个数,在最后再输出。
问题描述:编写程序,把给定长度为10的整数数组中所有元素循环右移 j 位。
输入:从键盘随机输入十个整数,作为数组a的元素;输入一个正整数j作为移动位数。
输出:移动后的整数数组a中的所有元素,各元素间无间隔字符。
样例:输入 1 2 3 4 5 6 7 8 9 0
2
输出 9012345678
#include
int main(){
long a[9],j,i;
for(i=0;i<=9;i++)
scanf("%ld",&a[i]);
getchar();
scanf("%ld",&j);
if(j>10)j%=10;//队列思想,移动位数可以大于十
for(i=10-j;i<=9;i++){
printf("%ld",a[i]);
}
for(i=0;i<10-j;i++){
printf("%ld",a[i]);
}
return 0;
}
问题描述:编写程序判断任意给定3*3的两维整型数组中是否有相同元素。
输入:从键盘随机输入九个整数,作为数组的元素。
输出:如果数组中有相同元素,则输出“yes”;否则,输出“no”。
提示:OJ所用编译器,不支持bool类型。
样例1 输入 0 1 2 3 4 5 6 7 8 输出 no
样例2 输入 0 0 2 3 4 5 6 7 8 输出 yes
#include
int main(){
long a[9],i,t=0,j;
for(i=0;i<=8;i++)scanf("%ld",&a[i]);
for(i=0;i<=8;i++)
{
for(j=i+1;j<=8;j++)
if(a[i]==a[j])
{
t=1;
break;
}
}
if(t==1)printf("yes");
else printf("no");
return 0;
}
对应就完事。
问题描述:已知5个元素的整型数组 A 未排序,一个索引数组 B 保存 A 的下标。编写程序,在不改变数组A的情况下,只改变数组 B完成对A的排序,如下图所示。
输入:从键盘随机输入五个整数,作为数组A的元素。
输出:第一行输出排序后数组A的五个元素,各元素间无间隔字符;第二行输出数组B排序后的五个元素,各元素间无间隔字符。
#include
int main(){
long a[5],i,t=0,b[5],j,r;
for(i=0;i<=4;i++)scanf("%ld",&a[i]);
for(i=0;i<=4;i++)printf("%ld",a[i]);
for(i=0;i<=4;i++)b[i]=a[i];//记录
printf("\n");
for(i=0;i<=4;i++)
for(j=i+1;j<=4;j++)
if(a[i]>a[j]){
r=a[i];a[i]=a[j];a[j]=r;//冒泡排序
}
for(i=0;i<=4;i++)
for(j=0;j<=4;j++)
if(b[i]==a[j])printf("%ld",j);
return 0;
}
题目内容:编写一个程序统计某班(人数不超过50人)3门课程的成绩,它们是语文、数学和英语。先输入学生人数, 然后按编号从小到大的顺序依次输入学生成绩, 最后统计每门课程全班的总成绩和平均成绩。
输入:学生人数及每个学生各科成绩(每个学生的成绩占1行)
输出:每门课程全班的总成绩和平均成绩(第1行为各科总成绩,相邻2个数据之间间隔1个空格;第2行为各科平均成绩,相邻2个数据之间间隔1个空格)。
样例:
输入:
3
65 76 70
82 79 85
92 82 95
输出:
239 237 250
79 79 83
#include
int main(){
long a[50][3],i,t,m,s1=0,s2=0,s3=0,s4=0,s5=0,s6=0;
scanf("%ld",&m);
for(i=0;i<=m-1;i++)
for(t=0;t<=2;t++){
scanf("%ld",&a[i][t]);}
for(i=0;i<=m-1;i++){
s1=s1+a[i][0];
s2=s2+a[i][1];
s3=s3+a[i][2];
s4=s1/m;
s5=s2/m;
s6=s3/m;
}
printf("%ld %ld %ld\n",s1,s2,s3);
printf("%ld %ld %ld",s4,s5,s6);
return 0;
}
可以用结构体,但没必要()
题目内容:编写一个程序判定用户输入的一个小于1010的正整数是否为“回文数”,所谓回文数是指正读反读都相同的数。
输入:一个正整数
输出:YES或NO
样例1: 输入:125521 输出:YES
样例2: 输入:1 输出:YES
#include
int main(){
long a,i,t=1,j,r;
scanf("%ld",&a);
r=a;
if(a<=9)printf("YES");
else {
while(a>=10){
a/=10;t++;}
long b[t];
for(i=0;i<t;i++){
b[i]=r%10;
r/=10;
}
for(i=0;i<t/2;i++)
for(j=t-1;j>=t/2;j--){
if(((i+j)==t-1)&&(b[i]!=b[j]))r=1;
}
if(r==1)printf("NO");
else printf("YES");
}
return 0;
}
还是老套路,求每位数,再比较。
题目内容:将一个由10个元素构成的int数组中的元素按逆序重新存放。
输入:10个整数
输出:按逆序重新存放后的数组元素(相邻元素之间用一个空格隔开)
样例 输入:6 8 12 11 3 5 9 16 19 24 输出:24 19 16 9 5 3 11 12 8 6
#include
int main(){
long a[10],i,j,r;
for(i=0;i<=9;i++)scanf("%ld",&a[i]);
for(i=0;i<=4;i++)
for(j=9;j>=5;j--){
if((i+j)%9==0){
r=a[i];a[i]=a[j];a[j]=r;
}
}
for(i=0;i<=8;i++)printf("%ld ",a[i]);
printf("%ld",a[9]);
return 0;
}
偷懒就反着输出,不偷就一个一个交换慢慢来。
题目内容: 编写一个程序将用户输入的十进制整数转换成给定进制的数。假设所有进制数长度不超过20位,所要转换的进制从从二进制变到九进制。
输入:十进制整数及要转换成的进制
输出:转换后的其它进制数
样例: 输入:32767 2 输出:11111111111111
样例: 输入:32767 6 输出:411411
#include
int main(){
long a[20],i,r=0,t,m,n;
scanf("%ld%ld",&m,&n);
t=m;
for(i=0;i<=19;i++){
a[i]=m%n;
m=m/n;
r++;
if(m<n){a[i+1]=m;break;}
}
for(;r>=0;r--)printf("%ld",a[r]);
return 0;
}
简单的进制转换。
题目内容:n只猴子(n<100)要选大王,选举方法如下:所有猴子按1,2,3,……, n编号围坐一圈,从第1号开始按照1,2,……, m报数,凡报到m号的退出圈外,如此循环报数,直到圈内剩下一只猴子时,这只猴子就是大王。编程一个程序实现上述过程,n和m由键盘输入。
输入:猴子的数量n及报数的最大数字
输出:退出圈外的猴子编号序列(每数字后紧跟1个空格)
样例 输入: 5 3
输出: 3 1 5 2 4
#include
int main(){
long n,m,i,t=-1,r=0;
long flag[100]={0};//初始化
scanf("%ld%ld",&n,&m);
for(i=1;i<=n;i++){
while(r<m){
t=(t+1)%n;//队列思想,出圈再循环
if(flag[t]==0)r++;//检查标记,计数器+1
}
printf("%ld ",t+1);//数组下标与实际号码差1
flag[t]=1;//对输出的元素标记
r=0;//初始化
}
return 0;
}
挺有意思的一道题,只要掌握队列圈内循环的思想,这道题就迎刃而解了。