取一个整数各偶数位上的数构成一个新的数字

1 题目

我可太难了,这题我的思路有点复杂,遇到的困难很多,总是值传递搞不清楚,地址传递总是写错。

从低位开始取出一个整数s的各奇数位上的数,剩下的偶数位的数依次构成一个新数t。
例如:
输入s:3716924
输出t:762
知识点1:值传递和地址值传递,刚刚错了好几遍
知识点2:将数组中所有元素变成一个数,各十百千怎么计算

2 思考

3 答案

3.1 聪明的方法

/*
从低位开始取出一个整数s的各奇数位上的数,
剩下的偶数位的数依次构成一个新数t。 
例如
输入s:3716924
输出t:762 
*/
#include <conio.h>
#include <stdio.h> 
int fun (int s)
{
	int sl=10,t;
	s /= 10;
	t = s % 10;
	while(s>0)
	{ 
		s = s / 100;
		t = s%10*sl + t;
		sl = sl*10;
	}
	return t;
}

int main()
{ 
	int s,t;
	printf("Please enter s:"); 
	scanf("%d", &s);
	t=fun(s);
	printf("The result is: %d\n", t);
	return 0;
}

在这里插入图片描述

3.2 笨方法

/*从低位开始取出一个整数s的各奇数位上的数,剩下的偶数位的数依次构成一个新数t。
例如:
输入s:3716924
输出t:762 
知识点1:值传递和地址值传递,刚刚错了好几遍
知识点2:将数组中所有元素变成一个数,各十百千怎么计算
*/
#include <stdio.h>
#include <string.h>
#define N 20
#define HL 1 //如果是从整数的右边低位到高位则为1;从整数的左边高位到低位是0

void deala(int a,int str[],int *p)
{
	int i=0;
	while((a>10)&&(i<N))
	{
		str[i]=a%10;
		i++;
		a=a/10;
	}
	str[i++]=a;
	*p=i;
}

int main(void)
{
	int a=0,b=0,tmp=0;
	int z=0,n,j;

	int str1[N]={0};
	int str2[N]={0};
	int num[N]={0};

	printf("请输入一个整数\n");
	scanf("%d",&a);

	//怎么遍历一个整数的各个位,并放进数组中,取余加除法
	deala(a,str1,&n);
	
	printf("数组元素长度n=%d\n",n);
	//n是整数s的长度,也是数组的长度

	printf("str1全部元素是\n");
	for(z=0;z<n;z++)
	{
		printf("%d\t",str1[z]);
	}
	printf("\n");
	//如何将数组元素倒着来,很重要n/2+1,不然没有任何效果
	for(z=0;z<(n/2+1);z++)
	{
		tmp=str1[z];
		str1[z]=str1[n-z-1];
		str1[n-z-1]=tmp;
	}

	printf("str1全部元素是逆序\n");
	for(z=0;z<n;z++)
	{
		printf("%d\t",str1[z]);
	}
	printf("\n");

	printf("数组元素长度n=%d\n",n);
	//n是整数s的长度,也是数组的长度
	
#if HL
	if(n%2==0)
	{//元素个数是偶数,则挑数组中下标为偶数的位
		printf("OO\n");
		for(z=0,j=0;z<n;z++)
		{
			if(z%2==0)
			{//挑数组中下标为偶数的位
				str2[j]=str1[z];
				j++;
			}
		}
	}
	else
	{//元素个数是奇数,则挑数组中下标为奇数的位
		printf("JJ\n");
		for(z=0,j=0;z<n;z++)
		{
			if(z%2!=0)
			{//挑数组中下标为奇数的位
				str2[j]=str1[z];
				j++;
			}
		}
	}
#else
	for(z=0,j=0;z<n;z++)
	{
		if(z%2!=0)
		{
			str2[j]=str1[z];
			j++;
		}
	}
#endif

	//j是新的取过  组成的数组的长度
	printf("str2各个元素是\n");
	for(z=0;z<j;z++)
	{
		printf("%d\t",str2[z]);
	}
	printf("\n");

	//将数组的各个元素组成新的数据
	for(z=0;z<j;z++)
	{
		num[z]=j-z-1;
	}

	for(z=0;z<j;z++)
	{
		while(num[z]>0)
		{
			str2[z]=str2[z]*10;
			num[z]--;
		}
	}
	printf("str2经过处理组成的新的数组元素是\n");
	for(z=0;z<j;z++)
	{
		printf("%d\t",str2[z]);
	}
	printf("\n");
	for(z=0;z<j;z++)
	{
		b=b+str2[z];
	}
	printf("b=%d\n",b);

	return 0;
}

在这里插入图片描述

3.3 笨的方法——居然还写错了,尴尬,在做度程序题的时候发现怎么做都不对,还以为题目出错了,没想到是我自己搞错了。从低位开始取数,从低位开始取数,从低位开始取数。

看了下之前运行结果的图片,amazing,自己不知道是眼拙,还是盲目的自信,结果都错成那样了还能说自己终于做出来了。糊涂啊

历经千难险阻终于实现了功能

/*从低位开始取出一个整数s的各奇数位上的数,剩下的偶数位的数依次构成一个新数t。
例如:
输入s:3716924
输出t:762 
知识点1:值传递和地址值传递,刚刚错了好几遍
知识点2:将数组中所有元素变成一个数,各十百千怎么计算
*/
#include <stdio.h>
#include <string.h>
#define N 20

void deala(int a,int str[],int *p)
{
	int i=0;
	while((a>10)&&(i<N))
	{
		str[i]=a%10;
		i++;
		a=a/10;
	}
	str[i++]=a;
	*p=i;
}

int main(void)
{
	int a=0,b=0;
	int z=0,n,j;


	int str1[N]={0};
	int str2[N]={0};
	int num[N]={0};

	printf("请输入一个整数\n");
	scanf("%d",&a);

	deala(a,str1,&n);
	//怎么遍历一个整数的各个位???

	printf("str1全部元素是\n");
	for(z=0;z<n;z++)
	{
		printf("%d\t",str1[z]);
	}

	printf("\n");
	for(z=0,j=0;z<n;z++)
	{
		if(z%2!=0)
		{
			str2[j]=str1[z];
			j++;
		}
	}
	printf("str2奇数位元素是\n");
	for(z=0;z<j;z++)
	{
		printf("%d\t",str2[z]);
	}
	printf("\n");

	for(z=0;z<j;z++)
	{
		num[z]=j-z-1;
	}

	for(z=0;z<j;z++)
	{
		while(num[z]>0)
		{
			str2[z]=str2[z]*10;
			num[z]--;
		}
	}
	printf("str2奇数位元素变成是\n");
	for(z=0;z<j;z++)
	{
		printf("%d\t",str2[z]);
	}
	printf("\n");
	for(z=0;z<j;z++)
	{
		b=b+str2[z];
	}
	printf("b=%d\n",b);

	return 0;
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值