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
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;
}