分解整数的各个位for(;m;m/=10);
条件①:可根据题目需要自行发挥
条件②:以整数 m 为表达式,当m/=10不为0时持续循环,当m为0时便已经循环了m的各位数
条件③:每次循环表达式m/=10可删去整数m的末位数
关键 :在循环内可利用表达式 m%10 以获取整数m的末位数***
#include<stdio.h>
int main()
{
int n[10],i,m;
for(i=0;m;m/=10,i++) n[i]=m%10; //将整数 m 的各位数 自右向左 赋给了数组 n 的各个元素
return 0;
}
利用上述方法可以获取各位数,故而在for(;m;m/=10)的基础上,可以将整数m逆转,如123变为321
scanf("%d",&a);
for(t=a,b=0;t;t/=10) b=b*10+t%10; //利用整数分解,逆转a为b
判断奇偶 if(n&1);else;
&是位与操作符,n&1是将n的二进制形式与00000000 00000001按位做与操作。这时,只要n的最右边一位是1,结果就不 是0,为true,条件成立。所以这句话实际上就是if(n%2==1)
#include <stdio.h>
int main()
{
int n;
while(~scanf("%d",&n)){
if(n&1) printf("奇数\n");
else printf("偶数\n");
}
return 0;
}
%[*][输入数据宽度][长度]类型 %*c
“*”符:用以表示该输入项,读入后不赋予相应的变量,即跳过该输入值。
%*c作用时读取输入流中数字后的一个字符,并丢弃,使得后面的输入函数不能读到那个字符。
1867: n-1位数
时间限制: 3 Sec 内存限制: 64 MB
题目描述
已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。
输入
第一行为M,表示测试数据组数。 接下来M行,每行包含一个测试数据。
输出
输出M行,每行为对应行的n-1位数(忽略前缀0)。如果除了最高位外,其余位都为0,则输出0。
样例输入
4
1023
5923
923
1000
样例输出
23
923
23
0
基础做法:
#include<stdio.h> //1867: n-1位数
int main()
{ //
int n[6],i,t,j,m,a,b;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
for(i=0;m;m/=10){ //将 m 各位数自后向前赋给数组 n
n[i]=m%10;
i++;
}
a=0;
for(j=0;j<i-1;j++){ //得到反向的答案 a
a=a*10+n[j];
}
for(b=0;a;a/=10) b=b*10+a%10; //逆转 a 为 b 即正向n-1位数
printf("%d\n",b);
}
return 0;
}
进阶做法:
#include<cstdio>
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
scanf("\n%*c%d",&m); //利用%c跳过了\n后输入的字符,即输入整数的首位
printf("%d\n",m); //直接输出所得结果
}
}
跳出多重循环 goto mark;break mark;
#include <stdio.h>
int main()
{
while(1){
for(;;){
goto mark;
}
mark: //在这做一个标记mark
printf("sign\n");
}
return 0;
}
输出结果为不断循环输出的字符sign,可见函数通过goto mark;跳出了for循环,从而不断循环while;
输入一串字符 scanf("%[^\n]%*c",str);
读入一行字符串,而这串字符里面可能有空格、制表符等空白字符,如果直接用%s是不可以的,于是有些人就想到用gets(),但由于gets很难控制一般不推荐使用,所以用%[^\n]就可以很好的解决这个问题了,^表示"非",即读入其后面的字符就结束读入。