C语言练习作业2

19.输出闰年:输出21世纪中截至某个年份之前的所有闰年年份。判断闰年的条件是:能被4整除但不能被100整除,或者能被400整除。
/*输出闰年*/
#include <stdio.h>
int main(void) {
	int n; // 截止年份
	
	printf("请输入一个截止年份:");
	scanf("%d", &n);
	printf("2000年至%d年之间的闰年如下:\n", n);
	
	for (int i = 2000; i <= n; i++) {
		if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
			printf("%d\n", i);
		}
	}
	
	return 0;
}
20.用格雷戈里公式求给定进度的π值。

使用格雷戈里公式求π的近似值,要求精确到最后一项的绝对值小于给定精度eps。公式为:\frac{\pi }{4}=1-\frac{1}{3}+\frac{1}{5}-\frac{1}{7}+...

/*用格雷戈里公式计算π的近似值*/
#include<stdio.h>
#include<math.h>
int main(void){
	int denominator=1,i=1;
	//denominator为分母,赋初值为1,i表示当前项数序号,初始值为1
	double eps,flag=1.0,pi=0,item=1.0;
	//eps为精度值,flag为正负号,赋初值为正,pi存放累加和,初始值为0,item存放当前项值,初始值为1.0
	
	printf("请输入精度值eps:");
	scanf("%lf",&eps);
	
	while(fabs(item)>=eps){//fabs为求绝对值函数
		pi=pi+item;
		i++;
		flag=-flag;//改变正负号
		denominator=denominator+2;
		item=flag/denominator;
	}
	pi=pi+item;//加上最后一项
	pi=pi*4;
	printf("π=%lf\n",pi);
	printf("最后一项的项数是:%d",i);
	
	return 0;
}
21.统计一个整数的位数。从键盘读入一个整数,统计该数的位数。例如输入12534,输出5;输入-99,输出2;输入0,输出1;
/*统计整数位数*/
#include<stdio.h>
int main(void){
	int count,number,temp;//count记录位数,number为输入数字,temp为临时变量。
	count=0;
	
	printf("请输入一个整数:");
	scanf("%d",&number);
	temp=number;
	if(number<0)//如果number小于0,转换为正数
		temp=-number;
	do{
		count++;
		temp=temp/10;
	}while(temp!=0);
	printf("%d的位数为%d",number,count);
	
	return 0;
}
22.逆序输出一个整数的各位数字。输入一个整数,将其逆序输出。例如:输入12345,输出54321。
/*逆序输出一个整数*/
#include <stdio.h>
int main() {
	int num, reversed = 0;
	
	printf("请输入一个整数:");
	scanf("%d", &num);
	
	// 逆序输出各位数字
	while (num != 0) {
		int digit = num % 10; // 取出最后一位数字
		reversed = reversed * 10 + digit; // 将数字添加到反转结果中
		num /= 10; // 去掉最后一位数字
	}
	
	printf("逆序输出结果为:%d\n", reversed);
	
	return 0;
}
23.判断一个整数是否为素数。输入一个正整数m,判断它是否为素数。素数就是只能能被1和自身整除的正整数,1不是素数,2是素数。
/*判断素数*/
#include<stdio.h>
#include<math.h>
int main(void){
	int m,limit,i;
	
	printf("请输入一个正整数:");
	scanf("%d",&m);
	if(m<=1){
		printf("小于等于1的数不是素数!");
	}else if(m==2){
		printf("2是素数!");
	}else{
		limit=sqrt(m)+1;
		for(i=2;i<=limit;i++){
			if(m%i==0){
				break;//若m能被某个i整除,则m不是素数,结束循环
			}
		}
		if(i>limit){
			printf("%d是素数",m);
		}else{
			printf("%d不是素数!",m);
		}
	}
	return 0;
}
24.简单的猜数游戏。输入你所猜的数(假定为1~100),与计算机产生的被猜数比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜7次。
/*猜数游戏*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(void){
	int count=0,flag,mynumber,yournumber;
	srand(time(0));//设定随机数的产生与系统时钟相关联
	mynumber=rand()%100+1;//随机产生一个1~100之间的被猜数
	flag=0;//flag为0表示没猜中,为1表示猜中了
	while(count<7){
		printf("请输入你猜的数:");
		scanf("%d",&yournumber);
		count++;
		if(yournumber==mynumber){
			printf("恭喜你!猜中啦!");
			flag=1;
			break;//已猜中,终止循环
		}else if(yournumber>mynumber){
			printf("猜大了!");
		}else{
			printf("猜小了!");
		}
	}
	if(flag==0){
		printf("游戏结束!");
	}
	
	return 0;
}
25.猜数字游戏加强版。先输入2个不超过100的正整数,分别是被猜数mynumber和允许猜测的最大次数n,再输入你所猜的数yournumber,与被猜数mynumber进行比较,若相等,显示猜中;若不等,显示与被猜数的大小关系,最多允许猜n次。如果1次就猜出该数,提示“Bingo!”;如果3次以内猜出该数,则提示“Lucky You!”;如果超过3次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,则提示“Game Over”;如果在到达n次之前,用户输入了一个负数,也输出“Game Over”并结束程序。
/*猜数游戏*/
#include <stdio.h>

int main() {
    int mynumber, n, yournumber, attempts = 0;

    printf("请输入被猜数(不超过100的正整数):");
    scanf("%d", &mynumber);

    printf("请输入允许猜测的最大次数:");
    scanf("%d", &n);

    while (attempts < n) {
        printf("请输入你猜的数:");
        scanf("%d", &yournumber);

        if (yournumber < 0) {
            printf("Game Over\n");
            break;
        }

        attempts++;

        if (yournumber == mynumber) {
            if (attempts == 1) {
                printf("Bingo!\n");
            } else if (attempts <= 3) {
                printf("Lucky You!\n");
            } else {
                printf("Good Guess!\n");
            }
            break;
        } else {
            if (yournumber < mynumber) {
                printf("猜小了\n");
            } else {
                printf("猜大了\n");
            }
        }
    }

    if (attempts >= n) {
        printf("Game Over\n");
    }

    return 0;
}
26.使用函数求阶乘和。输入一个正整数n(n≤16),计算1!+2!+3!+...+n!。要求定义和调用函数fact(n)计算n的阶乘,如果n是非负数,则该函数返回n的阶乘,否则返回0.
/*计算阶乘和*/
#include<stdio.h>
double fact(int n);
int main(void){
	int n;
	double sum=0;
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		sum+=fact(i);
	}
	printf("1!+2!+...+%d!=%.0lf\n",n,sum);
	
	return 0;

}
/*求n!的函数*/
double fact(int n){
	double result=1;
	if(n<0){
		return 0;
	}
	for(int i=1;i<=n;i++){
		result*=i;
	}
	return result;
}
27.求e的值:输入一个正整数n,计算下式的前n项之和(保留4位小数)。

e=1+\frac{1}{1!}+\frac{1}{2!}+\frac{1}{3!}+...+\frac{1}{n!}

//求e的值
#include <stdio.h>

double calculateE(int n);

int main(void) {
    int n;

    printf("请输入一个正整数:");
    scanf("%d", &n);

    double e = calculateE(n);

    printf("e的值为%.4lf", e);

    return 0;
}

double calculateE(int n) {
    double e = 1.0;
    double term = 1.0;

    for (int i = 1; i <= n; i++) {
        term *= (1.0 / i);
        e += term;
    }

    return e;
}
28.斐波那契数列问题。输入正整数n(1≤n≤46),输出斐波那契数列的前n项:1,1,2,3,5,8,13,...,每行输出8个。斐波那契数列就是满足任一项数字是前两项之和。
//斐波那契数列
#include<stdio.h>
int main(void){
	int n,x1,x2,x;
	
	printf("请输入一个1~46的正整数:");
	scanf("%d",&n);
	
	if(n<1||n>46){
		printf("参数不合法!");
	}else if(n==1){
		printf("%d",1);
	}else{
		x1=1;
		x2=1;//头两项都是1
		printf("%5d%5d",x1,x2);
		for(int i=3;i<=n;i++){
			x=x1+x2;
			printf("%5d",x);
			if(i%8==0){//输出8个数据后换行
				printf("\n");
			}
			x1=x2;
			x2=x;
		}
	}
	
	return 0;
}
29.素数问题。输入2个正整数m和n(1≤m≤n≤500),输出m到n之间的全部素数,每行输出10个。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。对m~n之间的每个数进行判断,若是素数,则输出该数。
//使用嵌套循环求m到n之间的全部素数
#include<stdio.h>
#include<math.h>
int main(void){
	int count,k,flag,limit,m,n;//flag表示是否为素数
	printf("请输入正整数m和n:");
	scanf("%d%d",&m,&n);
	count=0;//count记录素数的个数,用于控制输出格式
	if(m<1||n>500||m>n){
		printf("数据不合法!");
	}else{
		for(k=m;k<=n;k++){
			if(k<=1){
				flag=0;
			}else if(k==2){
				flag=1;
			}else{
				flag=1;
				limit=sqrt(k)+1;
				for(int i=2;i<=limit;i++){
					if(k%i==0){
						flag=0;
						break;
					}
				}
			}
			if(flag==1){
				printf("%6d",k);
				count++;
				if(count%10==0){
					printf("\n");
				}
			}
		}
	}
	
	return 0;
	
}
30.搬砖问题。某工地需要搬运砖块,已知男人一人搬3块,女人一人搬2块,小孩两人搬1块。如果想用n人正好搬n块转,问有哪些搬法?
//n人正好搬n块转
#include<stdio.h>
int main(void){
	int children,cnt,men,n,women;
	
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	cnt=0;
	for(men=0;men<=n;men++){
		for(women=0;women<=n;women++){
			for(children=0;children<=n;children++){
				if((men+women+children==n)&&men*3+women*2+children*0.5==n){
					printf("男人%d人,女人%d人,小孩%d人\n",men,women,children);
					cnt++;
				}
			}
		}
	}
	if(cnt==0){
		printf("无有效解");
	}
	
	return 0;
}
//n人正好搬n块转,优化版
#include<stdio.h>
int main(void){
	int children,men,women,n;
	int cnt=0;
	
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	float limit_men=n/3;
	float limit_women=n/2;
	for(men=0;men<=limit_men;men++){
		for(women=0;women<=limit_women;women++){
			children=n-men-women;
			if(men*3+women*2+children*0.5==n){
				printf("男人%d人,女人%d人,小孩%d人\n",men,women,children);
				cnt++;
			}
		}
	}

	if(cnt==0){
		printf("无有效解");
	}
	
	return 0;
}
31.找零钱问题。有足够数量的5分、2分和1分的硬币,现在要用这些硬币来支付一笔小于1元的零钱money,问至少要用多少个硬币?输入零钱,输出硬币的总数量和相应面额的硬币数量。
//找零钱问题。
#include<stdio.h>
int main(void){
	int flag,n1,n2,n5,money;
	//flag标识满足条件时中止循环,
	//n1,n2,n5分别表示1分,2分,5分硬币的数量。
	flag=1;
	printf("请输入需要支付的费用(输入小数点后内容即可):");
	scanf("%d",&money);
	for(n5=money/5;(n5>=0&&(flag==1));n5--){
		for((n2=money-n5*5)/2;(n2>=0)&&(flag==1);n2--){
			for(n1=money-n5*5-n2*2;(n1>=0)&&(flag==1);n1--){
				if((n5*5+n2*2+n1)==money){
					printf("五分%d枚,两分%d枚,一分%d枚,总共%d枚",n5,n2,n1,n1+n2+n5);
					flag=0;//置flag为0,则三重循环的条件都不满足,中止嵌套循环
				}
			}
			
		}
	}
	
	return 0;
}
32.输出水仙花数。输入一个正整数n(3≤n≤7),输出所有的n位水仙花数。水仙花数是指一个n位正整数,它的各位数字的n次幂之和等于它本身。
#include <stdio.h>
#include <math.h>

int main() {
	int n;
	printf("请输入一个正整数n(3≤n≤7):");
	scanf("%d", &n);
	
	if (n < 3 || n > 7) {
		printf("输入不在允许的范围内。\n");
		return 1; // 返回错误代码
	}
	
	int start = pow(10, n - 1);  // 计算起始值
	int end = pow(10, n) - 1;    // 计算结束值
	
	for (int i = start; i <= end; i++) {
		int num = i;
		int sum = 0;
		
		while (num > 0) {
			int digit = num % 10;
			sum += pow(digit, n);
			num /= 10;
		}
		
		if (sum == i) {
			printf("%d\n", i);
		}
	}
	
	return 0;
}

模块化结构版本如下: 

#include <stdio.h>
#include <math.h>

// 计算一个数字的幂次之和
int calculateSumOfPowers(int num, int n) {
	int sum = 0;
	
	while (num > 0) {
		int digit = num % 10;
		sum += pow(digit, n);
		num /= 10;
	}
	
	return sum;
  }

int main(void) {
	int n;
	
	printf("请输入一个正整数n(3≤n≤7):");
	scanf("%d", &n);
	
	if (n < 3 || n > 7) {
		printf("输入不在允许的范围内。\n");
		return 1; // 返回错误代码
	}
	
	int begin = pow(10, n - 1);
	int end = pow(10, n) - 1;
	
	for (int i = begin; i <= end; i++) {
		int sum = calculateSumOfPowers(i, n);
		
		if (sum == i) {
			printf("%d  ", i);
		}
	}
	
	return 0;
}
33.使用函数判断完全平方数。定义一个判断完全平方数的函数IsSquare(n),当n为完全平方数时返回1,否则返回0,不允许调用数学库函数。当n是完全平方数时,n可以采用以下等差数列求和公式计算:
1+3+5+7+...+(2×m-1)=m^{2}=n
/*判断完全平方数*/
#include<stdio.h>
//判断完全平方数函数
int IsSquare(int n){
	for(int i=1;n>0;i=i+2){
		n=n-i;
	}
	if(n==0)
		return 1;
	else
		return 0;
}
//主函数
int main(void){
	int n;
	int isSquare;
	
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	
	isSquare=IsSquare(n);
	if(isSquare==1)
		printf("%d是完全平方数!\n",n);
	else
		printf("%d不是完全平方数!\n",n);
	
	return 0;
}
34.计算2个复数之和与之积。分别输入2个复数的实部与虚部,用函数实现计算2个复数之和与之积。
/*计算复数*/
#include<stdio.h>
double result_real,result_imag;//全局变量,用于存放函数结果
int main(void){
	double imag1,imag2,real1,real2;
	void complex_prod(double real1,double imag1,double real2,double imag2);
	void complex_add(double real1,double imag1,double real2,double image2);
	
	printf("请输入第一个复数(实部和虚部):");
	scanf("%lf %lf",&real1,&imag1);
	printf("请输入第二个复数(实部和虚部):");
	scanf("%lf %lf",&real2,&imag2);
	complex_add(real1,imag1,real2,imag2);//求复数之和
	printf("两复数之和为:%.2f+%.2fi\n",result_real,result_imag);
	complex_prod(real1,imag1,real2,imag2);//求复数之积
	printf("两复数之积为:%.2f+%.2fi\n",result_real,result_imag);

	return 0;
}

//定义复数求和函数
void complex_add(double real1,double imag1,double real2,double imag2){
	result_real=real1+real2;
	result_imag=imag1+imag2;
}

//定义复数求积函数
void complex_prod(double rea1,double imag1,double real2,double imag2){
	result_real=rea1*real2-imag1*imag2;
	result_imag=rea1*imag2+real2*imag1;
}
35.输入正整数n,输出1!~n!的值。要求定义并调用含静态变量的函数fact_s(n)计算n!。
#include<stdio.h>
double fact_s(int n);
int main(void){
	int n;
	printf("请输入一个正整数n:");
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		printf("%3d!=%.0f\n",i,fact_s(i));
	}
	return 0;
}
double fact_s(int n){
	static double f=1;
	/*定义静态变量,存放在静态存储区,生存周期持续到程序结束,
	一旦含有静态局部变量的函数被再次调用就会被重新激活,且保留
	上次调用后的值*/
	f=f*n;
	
	return(f);
}
36.大小写英文字母转换。输入一行字符,将其中的大写字母转换为相应的小写字母后输出,大小写字母的判断和转换用else-if语句实现。
/*大小写英文字母转换*/
#include<stdio.h>
int main(void){
	char ch;
	
	printf("请输入一段字符:");
	ch=getchar();
	
	while(ch!='\n'){
		if(ch>='A'&&ch<='Z'){
			ch=ch-'A'+'a';
		}else if(ch>='a'&&ch<='z'){
			ch=ch-'a'+'A';
		}
		putchar(ch);
		ch=getchar();
	}
	
	return 0;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你代码有bug!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值