問題一
-
編寫一段代碼,求出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 -
思路解析
得到數據個數,進而確定二維數組的行數,再通過gets()函數將數據存到二維數組中,每行存放一個字符串。
每次循環通過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;
}