问题一
-
编写一段代码,求出T(1<=T<=5000)个数字X(1<=X<=3000)的因子个数。
-
输入
第一行包含一个整数T,表示输入T(1<=T<=5000)组数据
接下来的T行每行包含一个数X(1<=X<=3000) -
输出
输出T行
每行包含一个整数表示X的因子个数 -
样例输入
3
5
6
7 -
样例输出
2
4
2 -
思路解析
通过输入的第一个数,也就是数据个数进而确定数组长度,再将之后输入的数据存到数组里。
如何确定每个数的因子?从1开始遍历,只要被该数取余为0的数,都是该数的因子。 -
c语言实现如下
#include<stdio.h>
int main()
{
int T,x,sum=0;
scanf("%d",&T);
int a[T];
for(int i=0;i<T;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<T;i++){
x=a[i];
for(int j=1;j<=x;j++){
if(x%j==0){
sum++;
}
}
printf("%d\n",sum);
sum=0;
}
return 0;
}
问题二
-
给出一个长度为n的数列,如果数列中一个数与其余n-1个数差的绝对值之和最小,这个数就是完美数。
-
输入
第一行一个数n,第二行n个数(1<=n<=10000) -
输出
这个数列中的完美数,如果有多个输出任意一个 -
样例输入
6
1 2 3 5 7 100
11
7 11 21 15 14 13 12 11 10 9 8 -
样例输出
3
11 -
思路解析
有序数列的中位数即是完美数,如果数列个数为偶数,即存在多个完美数,输出一个即可。(即使中间两个完美数相差非常大,其差值也会相互抵消掉,可以私下进行验证,如有错误敬请指正。)
同样是通过第一个数获取数组长度并存入之后的数据,将数组排序即可。
由于数组是从0开始计数,因此在写循环判断条件时要理清是否会发生越界等问题。 -
c语言实现如下
#include<stdio.h>
#include<math.h>
int main(){
int n,x=0;
scanf("%d\n",&n);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
for(int j=0;j<n-i-1;j++){
if(a[j]>a[j+1]){
x=a[j];
a[j]=a[j+1];
a[j+1]=x;
}
}
}
x=n/2;
printf("%d\n",a[x-1]);
return 0;
}
问题三
-
编程找出其中对称的串。
-
输入
第一行包含一个整数T,表示输入包含T组测试样例。每组测试用例输入一个字符串(长度小于1000)。 -
输出
对于每组样例,若字符串为回文串(对称串),输出Yes,否则输出No。 -
样例输入
3
123
121
123456654321 -
样例输出
No
Yes
Yes -
思路解析
得到数据个数,进而确定二维数组的行数,再通过getchar()函数将数据存到二维数组中,每行存放一个字符串。
每次循环通过strlen()函数计算一个字符串长度,设置一个变量每次表示一个字符,与对称的那个字符相比,对称字符位置可以通过总长度减去该变量长度得出,任一组字符不对称,即为非回文串。 -
c语言实现如下
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(){
int T,x=0,j;
scanf("%d\n",&T);
char a[T][1000];
for(int i=0;i<T;i++){
gets(a[i]);
}
for(int i=0;i<T;i++){
x=strlen(a[i]);
for(j=0;j<x/2;j++){
if(a[i][j]!=a[i][x-j-1]){
break;
}
}
if(j==x/2){
printf("Yes\n");
}
else{
printf("No\n");
}
}
return 0;
}