递归,指针数组,判断完全平方数,去重数组的2种方法,进制转化,无n无文件结尾但有其他符号区别的输入

递归,指针数组,判断完全平方数,去重数组的2种方法,进制转化,无n无文件结尾但有其他符号区别的输入,第1张

递归,指针数组,判断完全平方数,去重数组的2种方法,进制转化,无n无文件结尾但有其他符号区别的输入

递归:

我参照大佬(帅她)的csdn;可以把处理递归分为3个步骤:

1.明确你这个函数想要干什么

2.寻找递归结束条件

3.找出函数的等价关系式

详细的可以看这篇文章

(35条消息) 为什么你学不会递归?告别递归,谈谈我的经验_帅地-CSDN博客_递归

我先列举几道题:

易:

如这道题:

我们就可以用上面的步骤:

1.这个函数的作用是?

 很明显这是求交错幂级数的部分和的函数

2.结束条件:

当递归到n==1时:sum==x

3.等价条件:(缩小n的范围)

sum=x-(x*fn(x),n-1);

上代码:

double fn( double x, int n ){
    double sum=0;
    if(n==1){
        sum=x;
    }
    else{
        sum=x-x*fn(x,n-1);//主要要推出跟上一项的与本想的关系式;
    }
    return sum;
}

中:(哦们再来两道练练手)

 如题我们再来找三个条件:

#include  
void out(int x);//1~i-2不在杆上,i-1在杆上,i可装上或取下 
void put(int x){//这是放上去的函数 
	if(x>1)put(x-1);//把x之前的环放上 
	if(x>2)out(x-2);//再把除离x最近的留下 
	printf("%d: Un",x);//把x套上 结束条件:x==1 
	if(x>2)put(x-2);//再把其余的放上去; 
}
void out(int x){//这是拿出来的函数 
	if(x>2) out(x-2);//		
	printf("%d: Dn",x);//	
	if(x>2) put(x-2);//	
	if(x>1) out(x-1);//
}
int main(){
    int n;
    char a;
    scanf("%d %c",&n,&a);
    if(a=='U'){
    put(n);
    }
    else if(a=='D'){
    out(n);
    }
    return 0;
}

 汉吉塔:

 求n层汉吉塔从a到b的移动次数:

#include 
#include 

//函数声明
int sum=0;//次数
void move(char x, char y);
void hannuo(int n,char one ,char two,char three)
{
  if(n==1)move(one, three); //递归截止条件
  else
{
  hannuo(n-1,one ,three,two);//将 n-1个盘子先放到B座位上
  move(one,three);//将A座上地剩下的一个盘移动到C盘上
  hannuo(n-1,two,one,three);//将n-1个盘从B座移动到C座上
 
}
}
void move(char x,char y)
{
 printf("%c--->%c",x,y)
sum++;
}
 
int main()
{
 int n;
 printf("input your number");
 scanf("%d",&n);
 hannuo(n,'A','B','C');
printf("n%d",sum);
 return 0;
}

指针数组:

  

char *arr[4] = {"hello", "world", "shannxi", "xian"};
//arr就是我定义的一个指针数组,它有四个元素,每个元素是一个char *类型的指针,这些指针存放着其对应字符串的首地址。

看题:

 

int max_len( char *s[], int n ){
   int i;
    int a[1000010];
    for(i=0;imax){
            max=a[i];
        }
    }
    return max;
}

判断完全平方数:

看题:

输出样例: cnt = 6

int IsTheNumber ( const int N ){
    int a[10]={0};
    int n=N;
    int f=0;
    int i,g;
    while(n){//把数字转为数组;
         g=n%10;
        a[g]++;
        n=n/10;
    }
    for(i=0;i<10;i++){
        if(a[i]>=2){
            f=1;
        }
    }
    if(N>=100&&sqrt(N)==(int)sqrt(N)&&f==1){//sqrt(N)==(int)sqrt(N)判断是完全平方数;
        return 1;
    }
    else {
        return 0;
    }
}

去重数组的两种方法:

1.

两种数组嵌套法:

#include 
int a[100];
int b[100];
int main(){
	int i,j,k;
	int n;
	scanf("%d",&n);
	for(i=0;i 

2.

两层for去重法:

看题:

#include 
int fa[42];
int fb[42];
int c[42];
int main(){
    int a[21];
    int b[21];
    int n1,n2,i,j;
    scanf("%d",&n1);
    for(i=0;i 

 无n无文件结尾但有其他符号区别的输入:

看题:

#include 
#include 
int n[1000];
int m[1000];
int main(){
    int j=0;
    while(scanf("%d",&n[j++])){//学到了  可以写到周总结里;
        char e=getchar();
        if(e!=','){
            break;
        }
    }
    int i,k=0;
    for(i=0;i 

进制转化:

看题: 

思路:把所有的数字先转化为10进制,然后再转化为对应的进制;

#include 
int b[1000010];
int main() {
    int n,a[100010];
    int sum=0;
    char g;
    scanf("%d",&n);
    getchar();
    while((g=getchar())!='n'){
    	if(g>='0'&&g<=('0'+n-1)){//先把数字由字符转化为10进制;
    		sum = sum * n + (g - '0');
		}
	}
	int t;
	scanf("%d",&t);
	if(t==10){
		printf("%d",sum);
	}
	else{
		int i=0;
		while(sum){
			b[i++]=sum%t;//再转化为对应进制;
			sum=sum/t;
		}
		for(i=i-1;i>=0;i--){
			printf("%d",b[i]);
		}
	}
	return 0;
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5691865.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存