描述
已知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
这个题目的主要是要忽略前缀0,这个采用了除法和取余相结合的算法
#include<stdio.h>
int main() {
int n=100000;
int m,w;
scanf("%d",&m);
while(m--) {
scanf("%d",&w);
while(w%n==w) {
n/=10;
}
printf("%d\n",w%n);
}
return 0;
}
这一种解法没有什么技巧之处,相当于第一种算法更加通俗易懂
#include <stdio.h>
int main() {
int n,d,t=0,s=1,a;
scanf("%d",&a);
while (a--) {
t=0,s=1;
scanf("%d",&n);
while (n/10) {
d=n%10;
t=d*s+t;
s=s*10;
n=n/10;
}
printf("%d\n",t);
}
}
最后一种是我在网上看到的大牛的解法,特别的简单和巧妙,巧妙之处主要在于直接从输入中来处理问题,从根源来解决问题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n;
cin>>m;
while(m--)
{
scanf("\n%*c%d",&n);//\n用于收回车,%*c代表跳过一个字符变量(整数可以看成一个字符串),剩下的字符当作一个整数处理
cout<<n;
if(m)
{
cout<<endl;
}
}
}
#include <stdio.h>
int main()
{
int m;
int t;
scanf ("%d",&t);
while (t--)
{
scanf ("\n%*c%d",&m);
printf ("%d\n",m);
// scanf 格式中,如果在%后面、格式字符前面加上一个“*”附加说明符,表示跳过该输入,输入的数据不放入变量中。
// 而输入的 '\n' 是中和掉输出的 \n
// 也可以换成
// getchar();
// scanf("%*c%d",&m);
// 而 *c 表示忽略一位 也可以改成
// scanf("%*1d%d",&m);*c
}
return 0;
}