1、输入一行字符,分别统计出其中英文字母,空格,数字和其他字符的个数。
这个问题我之前博客写过,我们最普通的就是用ASCII码作为判断依据,输入一个字符看它在哪个范围内,然后就累计加一,可以翻看我之前的博客,但显然出题人是想让我们用c附录后面的库函数<ctype.h>,具体操作如下
void Total(char ar[])
{
int alpha = 0, digit = 0, space = 0, others = 0;
for (int i = 0; ar[i] != '\0'; ++i)
{
if (isalpha(ar[i]))
{
alpha++;
}
else if (isdigit(ar[i]))
{
digit++;
}
else if(isspace(ar[i]))
//else if (ar[i]==' ') 这里也可以这样写,但有的编译器可能不识别,所以不建议;
{
space++;
}
else
{
others++;
}
}
printf("字母有%d个\n数字有%d个\n空格有%d个\n其他字符有%d个\n", alpha, digit, space, others);
}
int main()
{
char ar[100]={o}; //先初始化都为0;
gets_s(ar);
Total(ar);
return 0;
}
2、求Sn=a+aa+aaa+···+aaa··a之值,其实a是一个数字,n表示a的位数,例如:2+22+222+2222+22222(此时n=5),n由键盘输入。
这种题一般不难,难的是我们的分析,看懂它是怎么算的,说实话,之前我做的时候,我一直用递归想返回它的值,但是他只能返回一个,要么是22222,要么是2222,不会是它们之和Sn,后面研究后发现,这几个数都是前一数乘以10再加2,当然第一个数前面就是0咯,然后我们就可以写出代码;
int main()
{
int sum1=0,sum2=0;
int n=0;
scanf_s("%d",&n);
for(int i=0;i<n;++i)
{
sum1=sum1*10+2;
sum2+=sum1;
}
printf("%d",sum2);
return 0;
}
但是这个函数分块不明显,所以我们最好是把函数分为一块一块的,话不多说,看码
int Get_num(int a,int n)
{
int num=0;
for(int i=0;i<=n;++i)
{
num=num*10+a;
}
return num;
}
int Get_sum(int a,int n)
{
int sum=0;
for(int i=0;i<n;++i)
{
sum+=Get_num(a,i);
}
return sum;
}
int main()
{
int n=0,a=2;
scanf_s("%d",&n);
printf("%d",Get_sum(a,n));
return 0;
}
3、输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。例如153是一水仙花数,因为153=1立方+5立方+3立方;(标题格式好难打-.-)
这个简单,求出每个数字然后一立方再求和就可以判断了;
//上题已经说了函数尽可以分开写,所以我们后面不管需不需要冗余,我们尽量分块描述;
void Flower1(int n)
{
int x=n%10;
int y=n/10%10;
int z=n/100;
if(n==pow(x,3)+pow(y,3)+pow(z,3))
{
printf("%d\n",n);
}
}
void Flower2(int n)
{
int x=0,tmp=0;
int t=n;
while(t!=0)
{
x=n%10;
tmp+=pow(x,3);
x/=10;
}
if(tmp==n)
{
printf("%d\n",n);
}
}
int main()
{
for(int i=100;i<1000;++i)
{
Flower1(i);//Flower2(i)
}
return 0;
}
4、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”。编程找出6到1000之内的所有完数,并按下面格式输出其因子: 6 its factors are 1,2,3
这个题之前一看就很懵,经过老师点化后就好多了,比如我之前看打这个只想到一个循坏,果然还是太天真了,我们要在每个数的每一趟的循环里循环找它的因子,所以循坏就得俩个了,啧啧。
void PerfectNum()
{
int ar[100] = { 0 };
for (int i = 1; i < 1000; ++i)
{
int sum = 0;
int k = 0;
for (int j = 1; j < i; ++j) //判断因子 (循环条件其实可以改为j<=i/2,减少运算量)
{
if (i % j == 0)
{
sum += j;
ar[k++] = j;
}
}
if (sum == i)
{
printf("%d its factors are 1", i);
for (int i = 0; i < k-1; ++i)
{
printf(",%3d ", ar[i+1]);
}
printf("\n");
}
}
}
int main()
{
void PerfectNum();
return 0;
}
5、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃了一半,又多吃了一个。以后每天早上都吃前一天剩下的一半零一个。到第10天早上想在吃时,就只剩一个桃子了。求第一天共摘多少个桃子。
这个我们可以递归,也可以不递归,我们下面展示俩种方法;
int main()
{
int peach=1;
int day;
for(dat=9;day>0;--day)
{
peach=(peach+1)*2;
}
printf("%d ",peach);
return 0;
}
int Get_peach(int day)
{
if(day==10)
{
return 1;
}
else
{
return (Get_peach(day+1)+1)*2;
}
}
int main()
{
int day=1;
printf("%d ",Get_peach(1)); //求第一天的桃子
return 0;
}
6、俩个兵乓球对进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单,A说他不和X比,C说他不和X、Z比,请编程找出3对赛手的名单。
void Match()
{
for (char A = 'Y'; A <= 'Z'; ++A)
{
for (char B = 'X'; B <= 'Z'; ++B)
{
char C = 'Y';
if (A != B && A != C && B != C)
{
printf("A->%c\n", A);
printf("B->%c\n", B);
printf("C->%c", C);
}
}
}
}
int main()
{
Match();
return 0;
}