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;从整数的左边高位到低位是0void 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 HLif(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++;}}}
#elsefor(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 20void 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;
}