Open rickyzcode opened 4 years ago
输入两个整数a和b,计算a+b的和 注意此题是多组测试数据
输入两个整数A和B 范围不超过2^10
求A+B
https://www.dotcpp.com/oj/problem1000.html
#include<stdio.h>
int main()
{
int a,b;
while(~scanf("%d%d", &a, &b))printf("%d\n",a+b);
return 0;
}
scanf()函数返回值分为3种:
(1)返回正整数。表示正确输入参数的个数。
(2)返回整数0。表示用户的输入不匹配,无法正确输入任何值。
(3)返回-1。表示输入流已经结束。在Windows下,用户按下CTRL+Z(会看到一个^Z字符)再按下回车(可能需要重复多次),就表示输入结束;Linux/Unix下使用CTRL+D表示输入结束。
关于~的作用解析:
1、在Windows下,用户按下CTRL+Z(会看到一个^Z字符),会停止输入流,scanf会返回-1。
2、-1的补码为11111111 11111111 11111111 11111111 一共4个字节。
3、\~是C语言中的按位取反,因\~(-1)结果为00000000 00000000 00000000 00000000刚好为整数0的补码。
4、因此当输入Ctrl+Z时,scanf会返回-1,while(~-1)==while(0),0为假,退出while循环。
请参照本章例题,编写一个C程序,输出以下信息:
****** Hello World! ******
Hello与World之间有一个空格
*也是输出的一部分,别光打印Hello World!
无需输入
****** Hello World! ******
https://www.dotcpp.com/oj/problem1001.html
#include<stdio.h>
int main()
{
printf("**************************\n");
printf("Hello World!\n");
printf("**************************\n");
return 0;
}
编写一个程序,输入a、b、c三个值,输出其中最大值。
一行数组,分别为a b c
a b c其中最大的数
https://www.dotcpp.com/oj/problem1002.html
#include<stdio.h>
main()
{
int a=0,b=0,c=0,tmp=0;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
tmp = a;
else
tmp = b;
if(tmp<c)
tmp = c;
printf("%d",tmp);
return 0;
}
要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母.
例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。
请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、c2、c3、c4、c5分别变为’G’、’l’、’m’、’r’、’e’,并输出。
China
加密后的China
#include<stdio.h>
main()
{
char ch1,ch2,ch3,ch4,ch5;
scanf("%c",&ch1);
scanf("%c",&ch2);
scanf("%c",&ch3);
scanf("%c",&ch4);
scanf("%c",&ch5);
printf("%c%c%c%c%c",ch1+4,ch2+4,ch3+4,ch4+4,ch5+4);
return 0;
}
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。 n=0表示输入数据的结束,不做处理。
对于每个测试实例,输出在第n年的时候母牛的数量。 每个输出占一行。
#include<stdio.h>
int n;
int cow(n);
int main()
{
while(~scanf("%d",&n)){
if(n == 0)
break;
printf("%d\n",cow(n));
}
return 0;
}
int cow(n){
if (n<=4)
return n;
else
return cow(n-1)+cow(n-3);
}
#include <stdio.h>
int main()
{
int i, n, t1 = 0, t2 = 1, nextTerm;
printf("输出几项: ");
scanf("%d", &n);
printf("斐波那契数列: ");
for (i = 1; i <= n; ++i)
{
printf("%d, ", t1);
nextTerm = t1 + t2;
t1 = t2;
t2 = nextTerm;
}
return 0;
}
输入一个华氏温度,要求输出摄氏温度。公式为 c=5(F-32)/9,取位2小数。
一个华氏温度,浮点数
摄氏温度,浮点两位小数
#include<stdio.h>
int main()
{
float f;
scanf("%f", &f);
printf("c=%.2f\n",5*(f-32)/9);
return 0;
}
有三个整数a b c,由键盘输入,输出其中的最大的数。
一行数组,分别为a b c
a b c其中最大的数
#include<stdio.h>
int main()
{
int a,b,c,x;
scanf("%d %d %d",&a,&b,&c);
if(a>b){
x = a;
}
else
x = b;
if (x<c){
x = c;
}
printf("%d",x);
return 0;
}
有一个函数 y={ x x<1 | 2x-1 1<=x<10 \ 3x-11 x>=10
写一段程序,输入x,输出y
一个数x
一个数y
#include<stdio.h>
int fun();
int main()
{
int n;
scanf("%d",&n);
printf("%d",fun(n));
return 0;
}
int fun(n)
{
if(n<1){
return n;
}
else if((1<=n)&&(n<10)){
return (2*n-1);
}
else
return(3*n-11);
}
给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。
一个整数0-100以内
一个字符,表示成绩等级
#include<stdio.h>
int main()
{
int a;
char b;
scanf("%d",&a);
if(90<=a<=100){
b='A';
}
else if(80<=a<=89)
{
b='B';
}
else if(70<=a<=79)
{
b='C';
}
else if(60<=a<=69)
{
b='D';
}
else if(0<=a<=60)
{
b='E';
}
printf("%c",b);
return 0;
}
给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以及90分以上为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。
一个整数0-100以内
一个字符,表示成绩等级
#include <stdio.h>
int main()
{
int i,count=0,x[5]; //count统计位数,x[5]储存数字
for (i=0;i<5;i++)
{
int temp=0;
temp=getchar(); //temp临时储存数字字符的ASCII码
if (temp==10) break; //输入换行\n后跳出for循环
count++;
x[i]=temp-48; //字符0的ASCII码是48
}
printf("%d\n",count);
for (i=0;i<=count-2;i++) printf("%d ",x[i]);
printf("%d\n",x[i]);
for (i=count-1;i>=0;i--) printf("%d",x[i]);
return 0;
}
企业发放的奖金根据利润提成。利润低于或等于100000元的,奖金可提10%; 利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成 7.5%; 200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同),高于200000元的部分按5%提成; 400000<I≤600000元时,高于400000元的部分按3%提成;
600000<I≤1000000时,高于600000元的部分按1.5%提成; I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
一个整数,当月利润。
一个整数,奖金。
#include<stdio.h>
int main()
{
int profit,money;
scanf("%d",&profit);
switch (profit/100000){
case 0:
money = 0.1*profit;
break;
case 1:
money = 0.1*100000+(profit-100000)*0.075;
break;
case 2: case 3:
money = 0.1*100000+100000*0.075+(profit-200000)*0.05;
break;
case 4: case 5:
money = 0.1*100000+100000*0.075+200000*0.05+(profit-400000)*0.03;
break;
case 6: case 7: case 8: case 9:
money = 0.1*100000+100000*0.075+200000*0.05+200000*0.03+(profit-600000)*0.015;
break;
default:
money = 0.1*100000+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(profit-1000000)*0.01;
break;
}
printf("%d",money);
return 0;
}
输入两个正整数m和n,求其最大公约数和最小公倍数。
两个整数
最大公约数,最小公倍数
Tips:此处使用了迭代加欧几里得算法求最大公约数,而最小公倍数与最大公约数的乘积为两数的乘积
#include<stdio.h>
int big(int m, int n);
int main()
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d %d",big(m,n),m*n/big(m,n));
return 0;
}
int big(int m,int n){
if(n==0)
return m;
return big(n,m%n);
}
输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。
一行字符
统计值
Tips:
常用式
while((ch=getchar())!='\n')
#include<stdio.h>
#include<ctype.h>
int main()
{
int number=0,others=0,space=0,letter=0,ch;
while((ch=getchar())!='\n'){
if(isalpha(ch))
letter++;
else if(isdigit(ch))
number++;
else if(ch==' ')
space++;
else
others++;
}
printf("%d %d %d %d", letter, number, space, others);
return 0;
}
求Sn=a+aa+aaa+…+aa…aaa(有n个a)之值,其中a是一个数字,为2。 例如,n=5时=2+22+222+2222+22222,n由键盘输入。
n
Sn的值
/*使用pow()会时间超限*/
#include<stdio.h>
int main(){
int n, i, sum = 0;
scanf("%d", &n);
for(i = 0; i < n; i++){
sum *= 10;
sum += 2 * (i+1);
}
printf("%d", sum);
return 0;
}
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
n
Sn的值
#include<stdio.h>
long int n;
long int cycle(long int n) {
long int f;
if(n==0) return 1;
f = n * cycle(n - 1);
return f;
}
int main()
{
int i;
long int result = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++) {
result += cycle(i);
}
printf("%ld", result);
return 0;
}
求以下三数的和,保留2位小数 1~a之和 1~b的平方和 1~c的倒数和
a b c
1+2+...+a + 1^2+2^2+...+b^2 + 1/1+1/2+...+1/c
Tips: use 0.0 not 0
#include<stdio.h>
int main()
{
float a,b,c,sum=0.0;
int i;
scanf("%f %f %f",&a,&b,&c);
for(i=1;i<=a;i++){
sum += i;
}
for(i=1;i<=b;i++){
sum += i*i;
}
for(i=1;i<=c;i++){
sum += 1.0/i;
}
printf("%.2f",sum);
return 0;
}
打印出所有"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。
无
输出每一个水仙花数,一个数占一行 Tips: a should start from 1 not 0.
#include<stdio.h>
int main()
{
int a,b,c;
for(a=1;a<10;a++){
for(b=0;b<10;b++){
for(c=0;c<10;c++){
if((a*100+b*10+c)==(a*a*a+b*b*b+c*c*c)) printf("%d\n",a*100+b*10+c);
}
}
}
return 0;
}
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
N
? its factors are ? ? ?
Tips: take sum == n
out of the for cycle. Or 24(the wrong answer) will appear.
#include<stdio.h>
int Isdigit(int n);
void printnum(int n);
int n,i,m,N,sum=0;
int main()
{
scanf("%d",&N);
for(n=2;n<=N;n++){
if(Isdigit(n)){
printf("%d its factors are ",n);
printnum(n);
printf("\n");
}
sum = 0;
}
return 0;
}
int Isdigit(int n){
int sum=0,i;
for(i=1;i<n;i++){
if(n%i==0){
sum += i;
}
}
if (sum == n){
return 1;
}
return 0;
}
void printnum(int n){
for(m=1;m<n;m++){
if(n%m == 0){
printf("%d ",m);
}
}
}
有一分数序列: 2/1 3/2 5/3 8/5 13/8 21/13...... 求出这个数列的前N项之和,保留两位小数。
N
数列前N项和 Tips:
#include<stdio.h>
#define MAX 100
int main()
{
int a[MAX]={1,2};
int n,i,m;
float sum = 0.0;
scanf("%d",&n);
for(i=2;i<=n;i++){
m=a[i-1]+a[i-2];
a[i]=m;
}
for(i=1;i<=n;i++){
sum += (float)a[i]/(float)a[i-1];
}
printf("%.2f",sum);
return 0;
}
一球从M米高度自由下落,每次落地后返回原高度的一半,再落下。 它在第N次落地时反弹多高?共经过多少米? 保留两位小数
M N
它在第N次落地时反弹多高?共经过多少米? 保留两位小数,空格隔开,放在一行
#include <stdio.h>
#include <math.h>
int main()
{
double M,N;
double Lushang,Luxia;//分别用来计算上升/下降的总路程
scanf("%lf %lf",&M,&N);
Lushang=M*(1-pow(1.0/2.0,N-1)); //计算上升的总路程
Luxia=2*M*(1-pow(1.0/2.0,N)); //计算下降的总路程
printf("%.2lf %.2lf\n",M*pow(1.0/2.0,N),Lushang+Luxia);
//pow是幂次函数
return 0;
}
猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再吃时,见只剩下一个桃子了。求第一天共摘多少桃子。
N
桃子总数
#include<stdio.h>
int main()
{
int a,i,sum = 1;
scanf("%d",&a);
for(i=1;i<a;i++){
sum = 2*(sum+1);
}
printf("%d",sum);
return 0;
}
用迭代法求 平方根
公式:求a的平方根的迭代公式为: X[n+1]=(X[n]+a/X[n])/2 要求前后两次求出的差的绝对值少于0.00001。 输出保留3位小数
X
X的平方根 平方根迭代公式: https://blog.csdn.net/junbujianwpl/article/details/78024852
#include"stdio.h"
#include"math.h" //包含fabs()函数的头文件,别忘了加
int main()
{
int a;
double x=1.0,x1;
scanf("%d",&a);
while(fabs(x-x1)>1E-5){
x1=x;
x=(x1+a/x1)/2;
}
printf("%.3lf",x);
return 0;
}
用简单素数筛选法求N以内的素数。
N
2~N的素数
#include<stdio.h>
int n,m;
int Isnum(int n);
int main()
{
int a,i;
scanf("%d",&a);
for(i=2;i<=a;i++){
if(Isnum(i)){
printf("%d\n",i);
}
}
return 0;
}
int Isnum(int n){
for(int m=2;m<n;m++){
if(n%m==0) return 0;
}
return 1;
}
用选择法对10个整数从小到大排序。
输入10个无序的数字
排序好的10个整数
选择排序法
#include<stdio.h> //头文件
#define s 10 //定义一个宏参数
int main()
{
int a[s]={4,5,6,3,2,1,0,9,8,7}; //初始化数组;
int i,j;
int b=-1; //用来获取数组中最小的数,初始化时尽量不要与数组中的数字重合。
int c=-1; //用来获取a[]数组中的下标。
int M; //交换时临时变量。
for(i=0;i<s;i++) //给数组赋于新值,获取新的十个数。
{
scanf("%d",&a[i]);
}
for(j=0;j<s;j++) // 外层循环,从a[0]开始遍历。
{
b=a[j];//初始化b的值。
for(i=j;i<s;i++) //找出数组中最小的数和它的下标。
{
if(b>a[i])
{
b=a[i];
c=i;
}
}
if(c!=-1)//交换最小的数,不等于-1是为了防止出现b<a[i]时,数据停止执行。
{
M=a[j];
a[j]=a[c];
a[c]=M;
}
c=-1; //遍历时,每遍历一次,将下标初始化,注意初始化时尽量不要与数组中的下标重合。
}
for(i=0;i<s;i++)//输出。
{
printf("%d\n",a[i]);
}
return 0;
}
求一个3×3矩阵对角线元素之和。
矩阵
主对角线 副对角线 元素和
#include<stdio.h>
#define MAX 3
int main()
{
int x,y,sum1=0,sum2=0,a[MAX][MAX];
for(x=0;x<MAX;x++){
for(y=0;y<MAX;y++){
scanf("%d ",&a[x][y]);
if(x==y){
sum1 += a[x][y];
}
if(x+y==2){
sum2 += a[x][y];
}
}
}
printf("%d ",sum1);
printf("%d",sum2);
return 0;
}
已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。
第一行,原始数列。 第二行,需要插入的数字。
排序后的数列
#include<stdio.h>
//直接调整数组中数字的位置,使得排列有序
int main(int argc, char* argv[])
{
int num[10];
int i;
for (i = 0; i < 10; i++)
{
scanf("%d", &num[i]);
}
/*
**从最大的一个数开始比,如果比最大的数小,二者就交换位置,一旦碰到比它还小的数就跳出循环
*/
for (i = 8; i >= 0; i--)
{
int temp;
if (num[i + 1] > num[i])
{
break;
}
else
{
temp = num[i + 1];
num[i + 1] = num[i];
num[i] = temp;
}
}
/*
**遍历数组,循环输出
*/
for (i = 0; i < 10; i++)
{
printf("%d\n", num[i]);
}
return 0;
}
输10个数字,然后逆序输出。
十个整数
逆序输出,空格分开
#include<stdio.h>
#define MAX 10
int main()
{
int i,a[MAX];
for(i=0;i<MAX;i++){
scanf("%d",&a[i]);
}
for(i=MAX-1;i>=0;i--){
printf("%d ",a[i]);
}
return 0;
}
写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果两个整数由键盘输入。
两个数
最大公约数 最小公倍数 Tips: greatest common divisor should be got by division by rolling.
#include<stdio.h>
int gongyueshumax(int a,int b)
{
int t;
while(b!=0){
t=a%b;
a=b;
b=t;
}
return a;
}
int gongbeishumin(int a,int b)
{
int t;
t=(a*b)/gongyueshumax(a,b);
return t;
}
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d %d",gongyueshumax(a,b),gongbeishumin(a,b));
return 0;
}
求方程 的根,用三个函数分别求当b^2-4ac大于0、等于0、和小于0时的根,并输出结果。从主函数输入a、b、c的值。
a b c
x1=? x2=?
Tips: 一元二次方程 ax²+bx+c=0 (a≠0)
其求根依据判定式△的取值为三种 ( △=b²-4ac )
1. △>0,方程有两个不相等的实数根;
x1=[-b+√(△)]/2a; //( △=b²-4ac )
x2=[-b-√(△)]/2a;
2. △=0,方程有两个相等的实数根;
x1=x2=[-b+√(△)]/2a= -b/2a ;
3. △<0,方程无实数根,但有2个共轭复根。
x1=[-b+√(△)*i]/2a; //( △=b²-4ac )
x2=[-b-√(△)*i]/2a;
#include<stdio.h>
#include<math.h>
int main()
{
double a,b,c,delta;
scanf("%lf %lf %lf",&a,&b,&c);
delta = (b*b-4*a*c);
if(delta>0){
printf("x1=%.3lf ",(-b+sqrt(delta))/2/a);
printf("x2=%.3lf",(-b-sqrt(delta))/2/a);
printf("\n");
}
else if(delta==0){
printf("x1=%.3lf ",(-b)/2/a);
printf("x2=%.3lf",(-b)/2/a);
printf("\n");
}
else{
printf("x1=%.3lf+%.3lfi ",(-b)/2/a,sqrt(-delta)/2/a);
printf("x2=%.3lf-%.3lfi",(-b)/2/a,sqrt(-delta)/2/a);
printf("\n");
}
return 0;
}
写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
一个数
如果是素数输出prime 如果不是输出not prime
#include<stdio.h>
int prime(int a){
int i;
for(i=2;i<a;i++){
if(a%i==0) return 0;
}
return 1;
}
int main()
{
int a;
scanf("%d",&a);
if(prime(a)){
printf("prime");
}
else{
printf("not prime");
}
return 0;
}
写一个函数,使给定的一个二维数组(3×3)转置,即行列互换。
一个3x3的矩阵
无
#include<stdio.h>
int main()
{
int a[3][3],b,i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(i<j){
b = a[i][j];
a[i][j]=a[j][i];
a[j][i] = b;
}
}
}
for(i=0;i<3;i++){
printf("%d %d %d\n",a[i][0] ,a[i][1] ,a[i][2]);
}
return 0;
}
写一函数,使输入的一个字符串按反序存放,在主函数中输入输出反序后的字符串(不包含空格)。
一行字符
逆序后的字符串
#include<stdio.h>
#include<string.h>
int main()
{
char a[20];
int i;
scanf("%s",a);
for(i = (strlen(a)-1);i>=0;i--){
printf("%c",a[i]);
}
return 0;
}
写一函数,将两个字符串连接
两行字符串
链接后的字符串
#include<stdio.h>
#include<string.h>
#define MAX 10
int main()
{
char a[MAX],b[MAX];
scanf("%s",a);
scanf("%s",b);
for(int i=0;i<strlen(a);i++){
printf("%c",a[i]);
}
for(int i=0;i<strlen(b);i++){
printf("%c",b[i]);
}
return 0;
}
#include<stdio.h>
#include<string.h>
void mystrcat(char s1[],char s2[]);
int main(void)
{
char s1[100];
char s2[100];
scanf("%s%s",s1,s2);
mystrcat(s1,s2);
printf("%s",s1);
return 0;
}
void mystrcat(char s1[],char s2[])
{
while(*s1)s1++;
while(*s1++=*s2++);
}
写一函数,将一个字符串中的元音字母复制到另一个字符串,然后输出。
一行字符串
顺序输出其中的元音字母(aeiou)
#include<stdio.h>
#include<string.h>
#define N 1000
int main(){
char *vowel(char *str1,const char *str2);
char s1[N],s2[N];
gets(s2);//输入字符串
puts(vowel(s1,s2));//找到元音字母并输出
return 0;
}
char *vowel(char *str1,const char *str2){
int i,j,len;
char v[256];//ASCII码表
memset(v,'\0',sizeof(v));//初始化
v['a']=v['e']=v['i']=v['o']=v['u']=' ';//特殊位置为非零
len=strlen(str2);
for(i=0,j=0;i<len;i++)
if(v[str2[i]])//用str2[i]查表找到元音字母
str1[j++]=str2[i];//存入另一字符串
str1[j]='\0';//字符串结尾
return str1;
}
写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出"1 9 9 0"。
一个四位数
增加空格输出
#include<stdio.h>
#include<string.h>
int main()
{
int i;
char a[20];
scanf("%s",a);
for(i=0;i<strlen(a);i++){
printf("%c ",a[i]);
}
return 0;
}
编写一函数,由实参传来一个字符串,统计此字符串中字母、数字、空格和其它字符的个数,在主函数中输入字符串以及输出上述结果。 只要结果,别输出什么提示信息。
一行字符串
统计数据,4个数字,空格分开。 Tips: other characters should not include \n.
#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main()
{
char a[100];
int i,alpha=0,num=0,space=0,others=0;
scanf("%[^\n]%*c",a);
for(i=0;i<strlen(a);i++){
if(isalpha(a[i])) alpha++;
else if(isdigit(a[i])) num++;
else if(a[i]==' ') space++;
else others++;
}
printf("%d %d %d %d",alpha,num,space, others);
return 0;
}
定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。
两个数,空格隔开
交换后的两个数,空格隔开
//宏定义写出swap(x,y)交换函数
#define swap(x, y)\
x = x + y;\
y = x - y;\
x = x - y;
#include<stdio.h>
#define exchange(a,b) c = a;\
a = b;\
b = c;
int main()
{
int a,b,c;
scanf("%d %d",&a,&b);
exchange(a,b);
printf("%d %d",a,b);
return 0;
}
输入两个整数,求他们相除的余数。用带参的宏来实现,编程序。
a b两个数
a/b的余数
#include<stdio.h>
#define num(a,b) a%b
int main()
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d",num(a,b));
return 0;
}
三角形面积=SQRT(S(S-a)(S-b)*(S-c)) 其中S=(a+b+c)/2,a、b、c为三角形的三边。 定义两个带参的宏,一个用来求area, 另一个宏用来求S。 写程序,在程序中用带实参的宏名来求面积area。
a b c三角形的三条边,可以是小数。
三角形面积,保留3位小数
#include<stdio.h>
#include<math.h>
#define S (a+b+c)/2
#define area sqrt(S*(S-a)*(S-b)*(S-c))
int main()
{
float a,b,c;
scanf("%f %f %f",&a,&b,&c);
printf("%.3f",area);
return 0;
}
给年份year,定义一个宏,以判别该年份是否闰年。提示:宏名可以定义为LEAP_YEAR,形参为y,既定义宏的形式为 #define LEAP_YEAR(y) (读者设计的字符串)
一个年份
根据是否闰年输出,是输出"L",否输出"N"
Tips: 闰年的概念 能被4整除但不能被100整除或者能被400整除
#include<stdio.h>
#define LEAP_YEAR(y) ( (y%4==0 && y%100!=0 ) || y%400==0 )
int main()
{
int y;
scanf("%d",&y);
if(LEAP_YEAR(y)){
printf("L");
}
else{
printf("N");
}
return 0;
}
请设计输出实数的格式,包括:⑴一行输出一个实数;⑵一行内输出两个实数;⑶一行内输出三个实数。实数用"6.2f"格式输出。
一个实数,float范围
输出3行,第一行打印一遍输入的数,第二行打印两遍,第三行打印三遍。 第二行和第三行,用空格分隔同一行的数字。 实数用"6.2f"格式输出。
#include<stdio.h>
int main()
{
float a;
scanf("%f",&a);
printf("%6.2f\n",a);
printf("%6.2f %6.2f\n",a,a);
printf("%6.2f %6.2f %6.2f\n",a,a,a);
return 0;
}
分别用函数和带参的宏,从三个数中找出最大的数。
3个实数
最大的数,输出两遍,先用函数,再用宏。 保留3位小数。
#include<stdio.h>
#define MAX(a,b,c) (a>b?a:b)>c?(a>b?a:b):c
int main()
{
float a,b,c;
scanf("%f %f %f",&a,&b,&c);
float max=MAX(a,b,c);
printf("%.3f\n",max);
printf("%.3f",((a>b?a:b)>c?(a>b?a:b):c));
return 0;
}
输入一行电报文字,将字母变成其下一字母(如’a’变成’b’……’z’变成’a’其它字符不变)。
一行字符
加密处理后的字符
#include <stdio.h>
#include <ctype.h>
int main(void)
{
char str[100];
int i = 0;
gets(str);
while(str[i] != '\0')
{
if(islower(str[i])) //如果是小写字母
{
printf("%c", str[i]+1);
}
else
{
putchar(str[i]);
}
i++;
}
return 0;
}
输入三个整数,按由小到大的顺序输出。
三个整数
由小到大输出成一行,每个数字后面跟一个空格
#include<stdio.h>
int main()
{
int a[3],b[3],i,temp;
scanf("%d %d %d",&a[0],&a[1],&a[2]);
if (a[0]>a[1]){
temp = a[1];
a[1]= a[0];
a[0] = temp;
}
if(a[2]<=a[0]){
b[0] = a[2];
b[1] = a[0];
b[2] = a[1];
}
else if(a[2]>=a[1]){
b[0] = a[0];
b[1] = a[1];
b[2] = a[2];
}
else{
b[0] = a[0];
b[1] = a[2];
b[2] = a[1];
}
for(i=0;i<3;i++){
printf("%d ",b[i]);
}
return 0;
}
冒泡算法
#include<stdio.h>
#include<stdlib.h>
#define N 8
void bubble_sort(int a[],int n);
//一般实现
void bubble_sort(int a[],int n)//n为数组a的元素个数
{
//一定进行N-1轮比较
for(int i=0; i<n-1; i++)
{
//每一轮比较前n-1-i个,即已排序好的最后i个不用比较
for(int j=0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
}
}
//优化实现
void bubble_sort_better(int a[],int n)//n为数组a的元素个数
{
//最多进行N-1轮比较
for(int i=0; i<n-1; i++)
{
bool isSorted = true;
//每一轮比较前n-1-i个,即已排序好的最后i个不用比较
for(int j=0; j<n-1-i; j++)
{
if(a[j] > a[j+1])
{
isSorted = false;
int temp = a[j];
a[j] = a[j+1];
a[j+1]=temp;
}
}
if(isSorted) break; //如果没有发生交换,说明数组已经排序好了
}
}
int main()
{
int num[N] = {89, 38, 11, 78, 96, 44, 19, 25};
bubble_sort(num, N); //或者使用bubble_sort_better(num, N);
for(int i=0; i<N; i++)
printf("%d ", num[i]);
printf("\n");
system("pause");
return 0;
}
输入三个字符串,按由小到大的顺序输出
3行字符串
按照从小到大输出成3行
#include<stdio.h>
#include<string.h>
int main()
{
char a[3][32],temp[32];
int i,j;
for(i=0;i<3;i++){
scanf("%s",a[i]);
}
for(i=0;i<3;i++){ /*冒泡算法*/
for(j=i+1;j<3;j++){
if(strcmp(a[i],a[j])>0){ /*字符串比较*/
strcpy(temp,a[i]); /*字符串拷贝*/
strcpy(a[i] ,a[j]);
strcpy(a[j] ,temp);
}
}
}
for(i=0;i<3;i++){
printf("%s\n",a[i]);
}
return 0;
}
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
10个整数
整理后的十个数,每个数后跟一个空格(注意最后一个数后也有空格)
#include <stdio.h>
void deal( int a[] );
int main()
{
int x[10];
for ( int i = 0; i < 10; i++ )
scanf( "%d", &x[i] );
deal( x );
return(0);
}
void deal( int a[] )
{
int max = 0, x, team, l, min = a[0];
for ( int i = 0; i < 10; i++ ) //找最小数,交换
{
if ( a[i] < min )
{
min = a[i]; l = i;
}
}
team = a[0];
a[0] = min;
a[l] = team;
for ( int k = 0; k < 10; k++ ) //找最大数,交换
{
if ( a[k] > max )
{
max = a[k]; x = k;
}
}
team = a[9];
a[9] = max;
a[x] = team;
for ( int j = 0; j < 10; j++ ) //输出
printf( "%d ", a[j] );
}
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成前面m个数。写一函数:实现以上功能,在主函数中输入n个数和输出调整后的n个数。
输入数据的个数n n个整数 移动的位置m
移动后的n个数
#include<stdio.h>
#include <malloc.h>
int main(){
int n,i,*b,*c,m;
scanf("%d",&n);
b = (int *) malloc( n * sizeof(int) );
for(i=0;i<n;i++){
scanf("%d",&b[i]);
}
scanf("%d",&m);
c = (int *) malloc( m * sizeof(int) );
for(i=n-m;i<n;i++){
c[i-n+m]=b[i];
}
for(i=n-m-1;i>=0;i--){
b[i+m]=b[i];
}
for(i=n-m;i<n;i++){
b[i+m-n]=c[i-n+m];
}
for(i=0;i<n;i++){
printf("%d ",b[i]);
}
free(b);
free(c);
return 0;
}
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。
初始人数n
最后一人的初始编号
Tips; 约瑟夫环问题 递推公式: f(N,M)=(f(N−1,M)+M)%N f(N,M)表示,N个人报数,每报到M时杀掉那个人,最终胜利者的编号
#include <stdio.h>
#define N 100
int main()
{
int a[N]={0};
int i,n,k=0,m=0;
scanf("%d",&n);
a[0]=n; //数组第0个存放第n位置,从第1个开始数
for(i=1;i<n;i++)
a[i]=i; //存放位置,a[1]就是存放1,a[2]存放2等等
for(i=1;m<n-1;i++) //做n-1次即可,m统计出圈次数
{
if(a[i%n]==0) //等于0,表示已经出圈
continue;
k++;
if(k==3) //计数到3,则对应的出圈
{
a[i%n]=0; //出圈
m++; //出圈加1
k=0;
}
}
for(i=0;i<n;i++) //看看最后留下的是原来的第几号
{
if(a[i]!=0)
printf("%d",a[i]);
}
return 0;
}
A typical file is composed of source file and header file.
Two versions of #include:
You can add information that can help you to locate the file.