GDPU C语言 天码行空8 函数

🍑 C语言实验专栏 (代码可免登录复制)


1. 求序列和

在这里插入图片描述


⭐ 输出没有小数的浮点数

#include <stdio.h>

double fun(int a, int n)
{
	double res = 0;
	int aa = a,i;//aa 记录每一项
	for(i = 1; i <= n; i++){
		res += aa;
		aa = aa * 10 + a;
	}
	return res;
}

int main(){
	int a,n;
	scanf("%d %d", &a,&n);
	printf("s=%.0lf", fun(a, n));
	return 0;
}

2. 求和函数的编写问题

⭐ 找规律

#include <stdio.h>

int sum(int sta, int cnt){
	int res = 0,i;
	for(i = sta; i < sta + cnt; i++)
		res += i;
	return res;
}

int main(){
	int n,i;
	scanf("%d",&n);
	int ans = 0;
	for(i = 1; i <= n; i++)
		ans += sum(i, i + 1);

	printf("sum=%d", ans);
	return 0;
}

3. 编写求 Fibonacci 数列第n项的值的函数问题

在这里插入图片描述


⭐ 斐波那契:1 1 2 3 5 ……
⭐ 记忆化搜索:在递归的基础上,去掉重复计算
⭐ 全局整型数组:默认值为 0

#include <stdio.h>

//记忆化搜索版
int f[1000000];
int fib(int n){
	if(f[n])
		return f[n];

	if(n == 1 || n == 2)
	{
		f[n] = 1;
		return f[n];
	}
	
	f[n] = fib(n-1) + fib(n-2);
	return f[n];
}


/*
//暴力递归版
int fib(int n){
	if(n == 1 || n == 2 )
		return 1;
	
	return fib(n - 1) + fib(n - 2);
}
*/
int main(){
	int n, m,i;
	scanf("%d,%d", &m, &n);
	int sum = 0;
	for(i = m; i <= n; i++)
		sum += fib(i);

	printf("sum=%d",sum);
	return 0;
}

4. 使用素数判断函数求区间内素数的和

在这里插入图片描述


😅 课后习题?找不到,不做了
⭐ 线性筛法求素数 O(n)

#include <stdio.h>

int st[1000000];//标记数组(0为素数,1为合数)(从 2 开始)
int p[1000000];//素数数组
int cnt;//素数个数

//初始 0 到 n 的所有素数
void init(int n){
	int i, j;
	st[1] = 1;//特殊处理一下 1,1 既不是质数,也不是合数
	for(i = 2; i <= n; i++)
	{
		if(!st[i])//没被筛掉的就是素数
			p[cnt++] = i;

		//线性筛法求素数
		for(j = 0; p[j] <= n / i; j++)
		{
			st[p[j] * i] = 1;//合数?干掉

			if(i % p[j] == 0)//保证每个合数都是被它的最小质因子筛掉的
				break;
		}
	}
}

int main()
{
	int low, up,i;
	scanf("%d,%d", &low, &up);
	init(up);
	int count = 0;
	int sum = 0;
	for(i = low; i <= up; i++)
	{
		if(!st[i])
		{
			count++;
			sum += i;
		}
	}
	printf("count=%d,sum=%d", count, sum);
	return 0;
}

5. 素数判断函数及其应用问题

在这里插入图片描述


😅 期末押题:判断素数

#include <stdio.h>

//素数扣 1
int prime(int n){
	int i;
	for(i = 2; i <= n / i; i++)
	{
		if(n % i == 0)
			return 0;
	}
	return 1;
}

int main()
{
	int n, i,j;
	scanf("%d", &n);
	for(i = n; i <= n + 10; i += 2)//枚举 [n,n+10] 的每一个偶数
	{
		for(j = 2; j <= i / 2; j++){//枚举 i 的每一对因子
			if(prime(j) && prime(i - j))//一对因子都是 素数
			{
				printf("%d=%d+%d\n", i, j, i - j);
				break;//跳出枚举因子对的 for循环
			}
		}
	}
	return 0;
}

6. 使用函数统计指定数字的个数

在这里插入图片描述
⭐ 取出 x 的每一位:x%10,x/10

#include <stdio.h>

//返回参数 x 中 2 的个数
int get2(int x){
	int res = 0;
	while(x)
	{
		if(x % 10 == 2)
			res++;
		x /= 10;
	}
	return res;
}


int main()
{
	int n;
	scanf("%d", &n);
	printf("count=%d",get2(n));
	return 0;
}

7. 输出 m~n 之间的所有水仙花数

在这里插入图片描述


😋 水仙花啊?简简单单啦,上手就是一顿乱敲……

在这里插入图片描述
😅 不得不吐槽一下:卡这种输出格式是想考验同学们的 printf(“答案”)的功底吗?


#include <stdio.h>

//参数 x 是水仙花数返回 1
int is(int x)
{
	int sum = 0; 
	int xx = x;//xx 备份一下 x
	while(x)
	{
		int t = x % 10;
		sum += t*t*t;
		x /= 10;
	}
	if(sum == xx)
		return 1;
	return 0;
}



int main()
{
	int n,m,i;
	printf("Input m and n: ");//神之输出
	scanf("%d %d", &m,&n);
	for(i = m; i <= n; i++)
	if(is(i))
		printf("%d\n", i);
	
	return 0;
}

8. 日期对应天数问题

在这里插入图片描述


⭐ 老题新做,函数调用的思想

#include <stdio.h>

// 返回 1 表示 闰年
int Isleap(int year){
	if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
		return 1; // 是闰年
	else
		return 0; // 不是闰年
}

// 验证日期合法性,并返回布尔值
int IsDate(int year, int month, int day){
	int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 每个月份对应的天数

	if(Isleap(year)) days[1] = 29; // 如果是闰年,将2月改为29天

	if(month < 1 || month > 12)      return 0; // 月份非法
	if(day < 1 || day > days[month - 1]) return 0; // 日子非法
	return 1;
}

// 计算日期对应的天数,并返回结果
int Days(int year, int month, int day){
	int days[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 每个月份对应的天数

	if(Isleap(year)) days[1] = 29; // 如果是闰年,将2月改为29天

	int count = 0,i;
	for(i = 0; i<month - 1; i++){
		count += days[i]; // 加上这个月之前的所有天数
	}
	count += day; // 加上当前这个月的天数

	return count;
}

int main(){
	int year, month, day;
	scanf("%d-%d-%d", &year, &month, &day);

	if(IsDate(year, month, day)){
		int day_count = Days(year, month, day);
		printf("NO:%d", day_count);
	}
	else{
		printf("DateError\n");
	}
	return 0;
}

🤠 投我以桃,报之以李。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值