1、从键盘输入一个整数,判断该数是否为素数。
- 素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#include<stdio.h>
#include<math.h>
int isPrime(int num){
int flag=1;
int i;
if(num<=1){
return 2;
}else{
for(i=2;i<=sqrt(num);i++){
if(num%i==0){
flag++;
break;
}
}
}
return flag;
}
int main(void){
int num;
scanf("%d",&num);
if(isPrime(num)==1){
printf("%d is Prime.\n",num);
}else{
printf("%d is not Prime.\n",num);
}
return 0;
}
2、求解从1到20000内的所有水仙花数。水仙花数是每位数字的n次方之和等于本身,n是这个数的位数。
#include<stdio.h>
void getPerBite4(int num,int bArray[],int *bArrayLength){
while(num>0){
bArray[*bArrayLength]=num%10;
num/=10;
*bArrayLength++;
}
}
int POW(int x,int y){
int sum=1,i;
for(i=0;i<y;i++){
sum*=x;
}
return sum;
}
void isNarchNum(int num,int bArray[],int bArrayLength){
int bSum=0;
int i;
for(i=0;i<bArrayLength;i++){
bSum+=POW(bArray[i],bArrayLength);
}
if (bSum==num){
printf("%d 是水仙花数。\n",num);
}
}
int main(void){
int isNum;
for(isNum=1;isNum<=20000;isNum++){
int bArray[10]={0};
int bArrayLength=0;
getPerBite4(isNum,bArray,&bArrayLength);
isNarchNum(isNum,bArray,bArrayLength);
}
}
- 题解二
-
- 这里其实n 的取值也就是1 2 3 4 5 位,其实可以逻辑上直接解决
-
- 另外 1~9 的 每一位数的1次方 都等于它本身,so
#include<stdio.h>
int POW(int x,int y){
int sum = 1;
int i;
for(i=0;i<y;i++){
sum*=x;
}
return sum;
}
int main(void){
int n=1;
int i,j,num;
for(num=1;num<=20000;num++){
if(num<10){
n=1;
}else if(num<100){
n=2;
}else if(num<1000){
n=3;
}else if(num<10000){
n=4;
}else{
n=5;
}
int temp = num;
int tSum=0;
while(temp>0){
int part = temp%10;
tSum+=POW(part,n);
temp/=10;
}
if(tSum==num){
printf("%d 是水仙数。\n",num);
}
}
return 0;
}

3、求解从2到20000的所有完数。所有的真因数的和等于本身的数字称为完数。
#include<stdio.h>
int main(void){
int n,i;
for(n=2;n<=20000;n++){
int tSum=0;
for(i=1;i<n;i++){
if(n%i==0){
tSum+=i;
}
}
if(tSum==n){
printf("%d ",n);
}
}
return 0;
}
6 28 496 8128
4、从键盘输入两个数字n,m,求解m和n的最小公倍数。
- 最小公倍数= m*n / 最大公因数
- 最大公因数,辗转相除法
#include<stdio.h>
int getMaxCom(int a,int b){
int temp;
while(b>0){
temp = a%b;
a = b;
b = temp;
}
return a;
}
int main(void){
int n,m;
scanf("%d %d",&n,&m);
int MaxCom = getMaxCom(n,m);
int result = n*m / MaxCom;
printf("%d %d 的最小公倍数是 %d\n",n,m,result);
return 0;
}

5、一个小球从10m处落下,每次的弹回之前的高度一半,请问小球在静止之前一共走过多少距离。
#include<stdio.h>
int main(void){
double len = 10.0;
double sumDistance = 10.0;
while(len>0){
len/=2;
sumDistance+=len*2;
}
printf("一共走过了%lfm距离",sumDistance);
return 0;
}

6、斐波拉契数列。输入数列项数n=9,输出数列为:1 1 2 3 5 8 12 21 34
#include<stdio.h>
int main(void){
int n;
scanf("%d",&n);
int i,j,t,k;
j = 1;
t = 1;
for(i=0;i<n;i++){
if(i==0 || i==1){
printf("1 ");
}else{
k = j+t;
t = j;
j = k;
printf("%d ",j);
}
}
return 0;
}

7、输入一行英文,判断其一共有多少单词,不能包括冠词a,例如:A pen drop from tree. 一共有4个单词。
方法一:
#include<stdio.h>
int isWord(char *pWord,int wordArrayLength){
if(1==wordArrayLength && (('A'== *pWord) || ('a'==*pWord))){
return 0;
}
return 1;
}
int countWordIn(char *pStr){
int cnt = 0;
while(*pStr != '\0'){
char wordArray[10]={0};
int wordArrayLength=0;
while(*pStr !='\0' && *pStr != ' '){
wordArray[wordArrayLength++]=*pStr;
pStr++;
}
int ret = isWord(wordArray,wordArrayLength);
if(ret==1){
cnt++;
}
while(*pStr != '\0' && ' '== *pStr){
pStr++;
}
}
return cnt;
}
int main(void){
char sentence[1000];
gets(sentence);
int cnt = countWordIn(sentence);
printf("words is %d\n",cnt);
return 0;
}

方法二
- 我感觉上面的方法太啰嗦了,直接找冠词A 、a
- 判断一个单词的开头是否是A/a ,然后判断一个单词后面是否是空格,否则的话,单词总数++
#include<stdio.h>
int main(void){
char sentence[1000];
gets(sentence);
int isBegin=0;
int i;
int result=0;
for(i=0;sentence[i]!='\0';i++){
if(sentence[i-1]==' ' || i==0){
isBegin=0;
}else{
isBegin=1;
}
char zimu = sentence[i];
if((isBegin==0) && ((zimu=='A')||(zimu=='a')) && ((sentence[i+1]==' ')||(sentence[i+1]=='\0'))){
}else{
if(sentence[i+1]==' '||(sentence[i+1]=='\0')){
result++;
}
}
}
printf("%d\n",result);
return 0;
}

8、两个乒乓球队,甲队有a,b,c三名队员,乙队有d,e,f三名队员,甲队a不愿意跟d比赛,c不愿意跟d,f比赛,求合适的名单。
#include<stdio.h>
void getSchedule(char fristTeam[],char secondTeam[]){
int i,j;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
if(fristTeam[i]=='a' && secondTeam[j]=='d'){
continue;
}else if(fristTeam[i]=='c' && secondTeam[j]=='d'){
continue;
}else if(fristTeam[i]=='c' && secondTeam[j]=='f'){
continue;
}else{
printf("%c %c\n",fristTeam[i],secondTeam[j]);
}
}
}
}
int main(void){
char fristTeam[3]={'a','b','c'};
char secondTeam[3]={'d','e','f'};
getSchedule(fristTeam,secondTeam);
return 0;
}
答案是错误的
#include<stdio.h>
int main(void){
char one,two,three;
for(one='d';one<='f';one++){
for(two='d';two<='f';two++){
for(three='d';three<='f';three++){
if(one=='d'|| three=='d' || three=='f' ||one==two || one==three || two==three){
continue;
}else{
printf("a:%c\nb:%c\nc:%c\n",one,two,three);
}
}
}
}
return 0;
}
a:f b:d c:e
9、将三个字符串由小到大排序
#include<stdio.h>
#include<string.h>
int main(void){
char strings[3][100];
int i,j;
for(i=0;i<3;i++){
scanf("%s",strings[i]);
}
char temp[100];
for(i=0;i<2;i++){
for(j=0;j<2-i;j++){
if(strcmp(strings[j],strings[j+1])>0){
strcpy(temp,strings[j]);
strcpy(strings[j],strings[j+1]);
strcpy(strings[j+1],temp);
}
}
}
for(i=0;i<3;i++){
printf("%s ",strings[i]);
}
return 0;
}

10、一篇文本中共有3行文字,每行不多于5个字符,要求分别统计出每行中的大写字母、小写字母、数字、空格、以及其他字符的个数。
|