编程初学者周记(第七周)

本文介绍了四个数学与编程相关的实际问题:1) 使用函数计算特定数列的和,2) 欧拉函数的实现,3) 验证哥德巴赫猜想的函数,4) 找出指定范围内完数的算法。通过这些实例,展示了如何运用编程解决数论中的问题,包括计算连续数位数字之和、计算互质数的数量、判断素数和寻找完数。
摘要由CSDN通过智能技术生成

1.使用函数求特殊a串数列和

给定两个均不超过9的正整数a和n,要求编写函数求a+aa+aaa++⋯+aa⋯a(n个a)之和。

要求定义并调用函数fn(a,n),它的功能是返回aa⋯a(n个a)。

#include <stdio.h>
#include <math.h>
int fn(int a, int n)
{
	int i, result;
	result = a;
	for(i=1;i<n;i++)
	{
		result = a + result*10;
	}
	return result;
}

int main()
{
	int a, n, i;
	int sum = 0;
	scanf("%d %d", &a, &n);
	for(i=1;i<=n;i++)
	{
		sum += fn(a,i);
	}
	printf("fn(%d, %d) = %d\n", a, n, fn(a,n));	
	printf("s = %d", sum);
}

2.欧拉函数

在数论中,欧拉函数f(n)被定义为:小于等于n的正整数中和n互质的数的数目(互质即两者最大公约数为1)

如f(1)=1,因为与小于等于1的数中与1互质的数只有1

再如f(8)=4,因为小于等于8中的数与8互质的数有1,3,5,7,而2与8最大公约数为2,4与8最大公约数为4,6与8最大公约数为2

现在给定一个数n,求f(n)的值

要求定义并调用函数f(n),返回欧拉函数的值

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

int gcd(int m,int n)
{
	int i,l;
	if(m>n)
	{
		l = m;
		m = n;
		n = l;
	}
	for(i=m;i>=1;i--)
	{
		if(m%i==0 && n%i==0)
		break;
	}
	return i;
}

int fn(int n)
{
	int result, i;
	if(n==1)
	{
		result = 1;
	}
	else
	{
		result = 0;
		for(i=1;i<n;i++)
		{
			if(gcd(n,i)==1 || i==1)
			{
				result++;
			}
		}
	}
	return result;
}

int main()
{
	int t, i, n;
	scanf("%d", &t);
	for(i=1;i<=t;i++)
	{
		scanf("%d", &n);
		printf("%d\n", fn(n));
	}
}

3.使用函数验证哥德巴赫猜想

本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。

输入两个正整数m和n(0<=m<=n<=100),将m和n之间的偶数表示成两个素数之和,输出时每行显示5组。要求定义并调用函数prime(m)判断m是否为素数,当m为素数时返回1,否则返回0

#include <stdio.h>
#include <math.h>
int prime(int m)
{
	int limit, i;
	if(m<=1)
	return 0;
	else if(m==2)
	return 1;
	else
	{
		limit = sqrt(m) + 1;
		for(i=2;i<=limit;i++)
		{
			if(m%i==0)
			{
				break;
			}
		}
		if(i>limit)
		return 1;
		else
		return 0;
	}
}

int double_prime(int p)
{
	int j;
	if(p%2==0)
	{
		for(j=3;j<=p/2;j++)
	    {
		    if(prime(j)==1 && prime(p-j)==1)
		    {
			    printf("%d=%d+%d", p, j, p-j);
		        break;
		    }
	    }
	}
}

int main()
{
	int m, n, k, count;
	scanf("%d %d", &m, &n);
	count = 0;
	for(k=m;k<=n;k++)
	{
		double_prime(k);
		if(k%2==0 && k>=6)
		{
			count++;
		    if(count%5==0)
		    printf("\n");
		    else
		    printf(", ");
		}	
	}
}

4.使用函数输出指定范围内的完数

本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n之间的所有完数。所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。

要求定义并调用函数factorsum(number),它的功能是返回 number的因子和;定义和调用函数print_pn(m,n)逐行输出给定范围[m,n]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

#include <stdio.h>

int factorsum(int number)
{
	int i, sum = 0, flag = 0;
	for(i=1;i<=number/2;i++)
	{
		if( number % i == 0 )
		{
			flag = 1;
			sum += i;
			if(i==number/2)
			{
				flag = 0;
			}
		}	
		if( number==sum && flag==0 )
	    {
	    	return number;
	    }
	}
	
}

int print_fn(int m, int n)
{
	int j, k, flag = 1;
	for(j=m;j<=n;j++)
	{
		if(j == factorsum(j))
		{
			flag = 0;
			printf("%d = ", j);
			for(k=1;k<=j/2;k++)
			{
				if(j%k==0 && k!=j/2)
				{
					printf("%d + ", k);
				}
				else if(k==j/2)
				{
					printf("%d\n", k);
				}
			}
		}
	}
	if(flag == 1)
	{
		printf("No perfect number");
	}
}

int main()
{
	int m, n;
	scanf("%d %d", &m, &n);
	print_fn(m, n);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值