C语言学习笔记第六天练习作业

本文是一篇关于C语言编程实践的笔记,包括实现判断素数的函数并打印100~1000之间的所有素数,计算两个日期间的天数差,检查1亿到10亿之间的回文数,以及展示整数的补码和计算100的阶乘。代码中包含了详细的函数实现和主函数调用示例。
摘要由CSDN通过智能技术生成

C语言学习笔记第六天练习作业

  • 1、实现一个函数,判断是否是素数,调用它显示100~1000以内所有的素数
  • 2、输入两个日期(yyyy-mm-dd),计算两个日期间隔多少天
  • 3、实现一个函数,判断一个整数是否是回文数,调用它显示1亿-10亿的所有回文数
  • 4、输入一个整数,显示它的补码
  • 5、计算出100的阶乘

提示:练习4:计算机中数据以补码的方式储存,所以直接用位操作符取出即可

练习5:100!会很大,因此不能使用int 等数据类型储存,即使是long long int 也不够,因此需要用到数组,建议char类型数组

个人代码如下:

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


//判断是否为素数
int is_prime(int num)
{
	int flag=1;
	for(int i=2;i<num/2;i++)
	{
		if(num%i==0)
		{
			flag=0;
			break;
		}
	}
	return flag;
}

//返回1-1-1到year-month-day的时间间隔
long int day_pass(int year,int month,int day)
{
	long int count=0;
	if(year>1)
	{
		count+=(year-1)*365;	
	}
	for(int i=1;i<year;i++)
	{
		if(i%400==0 || i%4==0 && i%100!=0)
		{
			count++;
		}
	}
	switch(month-1)
	{
		case 11:count+=30;
		case 10:count+=31;
		case 9:count+=30;
		case 8:count+=31;
		case 7:count+=31;
		case 6:count+=30;
		case 5:count+=31;
		case 4:count+=30;
		case 3:count+=31;
		case 2:count+=28;
		case 1:count+=31;
		default:break;
	}
	for(int i=1;i<year;i++)
	{
		count++;
	}
	count+=day-1;
	return count;
}

//判断是否为回文数
int is_palindrome(long int num)
{
	long int num_1=num,temp=0;
	while(num)
	{
		temp=temp*10+num%10;
		num/=10;
	}
	if(temp==num_1)
	{
		return 1;	
	}else
	{
		return 0;	
	}
}

//显示一个数的补码
void show_complement(int data)
{
	for(int i=0;i<32;i++)
	{
		if(data&(1<<(31-i)))
		{
			printf("1");	
		}else
		{
			printf("0");	
		}
	}
	printf("\n");
}

//求n的阶乘
void factorial(char a[],int n)
{
	int cnt=1;
	int add=0;
	for(int i=0;i<n;i++)
	{
		a[i]=0;	
	}
	a[0]=1;
	for(int i=1;i<=n;i++)
	{
		add=0;
		for(int j=0;j<cnt;j++)
		{
			a[j]=i*a[j]+add;
			add=a[j]/10;
			a[j]=a[j]%10;
		}
		cnt++;
	}
}
int main(int argc,const char* argv[])
{
	printf("=========test01========\n");
	for(int i=100;i<1000;i++)
	{
		if(is_prime(i))
		{
			printf("%d ",i);	
		}
	}
	printf("\n");

	printf("=========test02========\n");
	printf("请输入xxxx-xx-xx:");
	int y1,m1,d1;
	scanf("%d%d%d",&y1,&m1,&d1);
	printf("请输入xxxx-xx-xx:");
	int y2,m2,d2;
	scanf("%d%d%d",&y2,&m2,&d2);
	printf("相差%ld天\n",abs(day_pass(y2,m2,d2)-day_pass(y1,m1,d1)));

	printf("=========test03========\n");
	int cnt=0;
	for(long int i=100000000;i<1000000000;i++)
	{
		if(is_palindrome(i))
		{
			printf("%ld ",i);
			/*
			if(cnt++>5)
			{
				break;	
			}
			*/
		}
	}
	printf("=========test04========\n");
	int x;
	printf("请输入x的值用来显示补码:");
	scanf("%d",&x);
	show_complement(x);

	printf("=========test05========\n");
	int n;
	printf("输入阶乘的阶数:");
	scanf("%d",&n);
	
	char b[n];
	factorial(b,n);
	int i=n-1;
	for(;i>=0;i--)
	{
		if(b[i]>0)
		{
			break;	
		}
	}
	for(;i>=0;i--)
	{
		printf("%d",b[i]);	
	}
	return 0;
}

最后的阶乘计算有瑕疵,还可以在此基础上继续优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值