计导实验七

B. 实验6_4_二进制转十进制

运行时间限制: 1000 运行内存限制: 65536
作者: bupt_admin 是否specialjudge: False
题目描述
在这里插入图片描述

一个关于进制转换的习题,方法——递归,说白了还是要找规律,这方面我比较弱,所以,还是忠实地记下来吧

#include<stdio.h>
int convert(int n)
{
	if(n==0||n==1)return n;
	else return n%10+convert(n/10)*2;//这里比较难想到,想方设法与下一个产生递归
}
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d\n",convert(n));
	return 0;
}

C. 实验6_5_二进制的位数

运行时间限制: 1000 运行内存限制: 65536
作者: bupt_admin 是否specialjudge: False
题目描述
问题描述:
设计递归函数int countBinary(int n);用于将非负十进制整数n转换成二进制形式,并返回该二进制数的位数。如十进制数13的二进制形式为1101,位数为4,那么调用countBinary(13)的结果为4。
要求同学们先写出该问题的递归定义式,再设计递归函数。

输入与输出要求:
输入一个非负整数n。输出求得的结果,如输入“13”,输出“4”,占一行。

程序运行效果:
Sample 1:
13↙
4↙
Sample 2:
2000000000↙
31↙
这个题,有点意思(对本小白来说)
首先琢磨了半天递归式要怎么写,写出了十进制转二进制的代码,如下

long long countBinary(int n)
{
	if(n==1)return 1;
	else return 10*countBinary(n/2)+(n%2);
} 

以下是完整代码(有问题)

#include<stdio.h>
#include<time.h>
long long countBinary(int n)
{
	if(n==1)return 1;
	else return 10*countBinary(n/2)+(n%2);//根据除K取余法得到递归式
} 
int main()
{
	int weishu=1;
	long long n;
	//long long x;
	scanf("%lld",&n);
	//srand(time(NULL));n=rand();printf("%d\n",n);
	printf("%lld\n",countBinary(n));
	x=countBinary(n);
	while(x/10)
	{
		weishu++;
		x/=10;
	}
	printf("%d\n",weishu);
	return 0;
}

交上去之后发现,运行超时
在这里插入图片描述
借鉴了一下别人的做法,发现,返回多少次就有多少位,得到了如下简洁准确的做法

#include<stdio.h>
#include<time.h>
//返回多少次就等于多少位吗??? 
int countBinary(long long n)
{
	if(n==1||n==0)return 1;//还是这里的问题? //果然是0的问题,本来n/2一定会先等于1就不用管0.但是,题目求的是非负整数的二进制位数,0是包含在其中的,所以0不能舍。 
	else return countBinary(n/2)+1;
 } 
int main()
{
	long long n;
	//long long x;
	scanf("%lld",&n);
	//srand(time(NULL));n=rand();printf("%d\n",n);
	printf("%lld\n",countBinary(n));
	return 0;
}

这个题,我还是又弄上来了,不是不会做,只是其中的数学原理还没理解,提醒自己弄明白

D. 实验6_7_最大公约数

运行时间限制: 1000 运行内存限制: 65536
作者: bupt_admin 是否specialjudge: False
题目描述
问题描述:
设计递归函数int GCD(int a,int b);计算正整数a和b的最大公约数并返回。如GCD(32,48)为16。
GCD(a,b)递归定义为:
GCD(a,b)=GCD(b,a MOD b) | a MOD b≠0
GCD(a,b)=b | a MOD b=0

输入与输出要求:
输入两个正整数a和b,输出两数的最大公约数数,占一行。

程序运行效果:
Sample 1:
32 48↙
16↙
Sample 2:
8 12↙
4↙

#include<stdio.h>
int GCD(int a,int b)
{
	if(a%b==0)return b;
	else return GCD(b,a%b);
}
int main()
{
	int a,b,t;
	scanf("%d%d",&a,&b);
	if(a<b)t=b,b=a,a=t;
	printf("%d\n",GCD(a,b));
	return 0;	
} 

E. 实验6_9_素数分解

运行时间限制: 1000 运行内存限制: 65536
作者: bupt_admin 是否specialjudge: False
题目描述
问题描述:
设计递归函数void recurPrintFactor(int n,…);打印出对n进行素数分解的结果。当执行recurPrintFactor(60)时,打印效果为:60=223*5。在函数的参数中“…”代表你可以添加参数。并且也可使用全局变量。关于素数分解的描述,见实验五第14题。
设计程序,已知一段数据范围[a,b],且a<=b,要求对其中的每一个数进行素数分解。你也可以设计其它辅助函数,如判断素数的函数isPrime(n)。

输入与输出要求:
输入两个正整数a、b,代表所分解的区间,满足1<=a<=b<=100000,且b-a<=100。输出b-a+1行,即b-a+1个数的分解。

程序运行效果:
Sample 1:
100 105↙
100=2255↙
101=101↙
102=2
317↙
103=103↙
104=2
2213↙
105=357↙
Sample 2:
9999 10005↙
9999=3311101↙
10000=2
2225555↙
10001=73137↙
10002=2
31667↙
10003=7
1429↙
10004=224161↙
10005=3
52329↙

说一下思路:先用isPrime把素数揪出来单独输出,再用recur来分解因数:找到一个因素之后,停止循环,寻找(该数除以此因数后的数)的因数,这是递归的条件。递归终止的条件是(该数除以此因数后的数)为1或0(一般不会是0),返回‘\n’。

#include<stdio.h>
void isPrime(int n)//不对,好像误读了题目意思 
{
	int i,flag=1;
	//printf("%d=",n);
	for(i=2;i*i<=n;i++)
	{
		if(n%i==0){
			flag=0;break;
		}
	}
	if(flag==1)printf("%d=%d\n",n,n);
	else printf("%d=",n),recurPrintFactor(n);
}
int recurPrintFactor(int n)
{
	//printf("%d=",n);论素数分解要如何递归?//逻辑有问题 
	//printf(" %d\n",n);
	if(n==1||n==0)printf("\n");
	else 
	{
		
		int i;//现在是符号问题 
		for(i=2;i<=n;i++)//限定条件错了,若限定为i*i<=n;那么,它本身很可能被略过 
		{
			if(n%i==0)break;
		}
		printf("%d",i);
		if((n/i)>1)printf("*"); //判断符号
		recurPrintFactor(n/i);
	}
}
int main()
{
	int a,b,i;
	scanf("%d%d",&a,&b);
	for(i=a;i<=b;i++)
	{
		isPrime(i);
	}
}

(我觉得没了)

发布了26 篇原创文章 · 获赞 18 · 访问量 1652

猜你喜欢

转载自blog.csdn.net/qq_40774136/article/details/102935585