1,打印如图所示的杨辉三角,要求打印出n行,n由键盘输入。
杨辉三角的性质是第一列全为1,而且上一行的两列相加等于下一行的一列。
显而易见,用二维数组实现再合适不过,首先将第一列全部设置为1,剩下的全部为0。再通过相加给剩余元素赋值。最后只显示左下半三角即可。
#include <stdio.h>
int main()
{
int i,j,N;
printf("请输入打印行数:");
scanf("%d",&N);
int a[N][N];
for(i = 0; i < N; i++)
{
a[i][i] = 1;
a[i][0] = 1;
}
for(i = 2; i < N; i++)
{
for(j = 1; j <= i - 1; j++)
{
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}
for(i = 0; i < N; i++)
{
for(j = 0; j <=i; j++)
{
printf("%6d", a[i][j]);
}
printf("\n");
}
printf("\n");
return 0;
}
2,请编程实现:输入几个整数,判断其中奇数的个数,并输出奇数的累加和。(要求:数据的个数及原始数据由键盘输入)
看到题目我的想法是将输入的整数逐个储存在数组中,然后通过循环逐个判断是否是奇数,如果是就累加起来求累加和,并通过m变量的自增来确定奇数总个数。
在这个过程中我觉得将需要的整数储存在数组中需要利用循环一个一个输入有点麻烦,但以现在掌握的知识我只有这一个方法。后面通过询问学长知道要通过结构体才能实现直接将更多数据储存在数组中,希望接下来能够尽快掌握这个知识。
#include<stdio.h>
#define N 100
int main()
{
int i,n;
int m=0,X=0;
int num[N];
printf("请输入整数个数:\n");
scanf("%d",&n);
printf("请输入整数数据:\n");
for(i=0;i<=n-1;i++)
{
scanf("%d",&num[i]);
}
for(i=0;i<=n-1;i++)
{
if(num[i]%2!=0)
X=X+num[i],m++;
}
printf("奇数个数是:%d",m);
printf("所有奇数和是:%d",X);
return 0;
}
3,打印出100~999之间的所有水仙花数。
首先通过了解水仙花数是一个三位数,其各位数字立方和等于该数本身的数。
那么我只需要将一个三位数的各个位数用三个数表示出来然后判断这三个数的立方和是否等于它本身就行。
实际代码中可以通过循环来遍历输入100到999的三位数,再利用求余符号和除号来表示个位十位百位,再通过if判断这三个数的立方和是否等于它本身,是就输出该数。
#include<stdio.h>
int main()
{
int i,x,y,z;
for(i=100;i<1000;i++)
{
x=i%10;
y=i/10%10;
z=i/100%10;
if(i==(x*x*x+y*y*y+z*z*z))
printf("%d\n",i);
}
return 0;
}
4,写一个判断素数的函数,在主函数中调用素数的判断函数,求出2到1000之间的素数的累加和,将结果输出。
调用函数没学太明白,就先用双重循环解决这题。
外层循环遍历输入2到1000之间的数,内层循环逐个输入整数i之前的整数j。再利用if判断语句判断在整数i之前有没有可以整除的公因数,有的话结束内层循环。
最后对输出的j和i进行判断,如果j大于等于i,说明i之前的数都不能被他整除,意思就是此时的i是素数,将这样的数累加起来就是2到1000之间所以素数的和。
#include <stdio.h>
int main()
{
int i,j,y;
int X=0;
for (i=2; i<=1000; i++)
{
for (j=2; j<i; j++)
{
if (i%j==0)
break;
}
if(j>=i)
X=X+i;
}
printf("%d",X) ;
return 0;
}
5,给出年、月、日,计算该日是该年的第几天。
对于这个问题我的第一想法是要注意平年和闰年的区别。
首先通过switch语句选择对应的输入月份的前几个月的天数和,再将该月的天数加上,这是当输入的年份是平年时的天数。
再通过if判断语句判断这一年是否是闰年,如果是闰年并且输入的月份大于2,就在原来的基础上加一。
#include<stdio.h>
int main()
{
int day, month, year, sum, leap;
printf("\n请输入年,月,日,格式为:年,月,日(2021,10,20)\n");
scanf("%d,%d,%d", &year, &month, &day);
switch (month)
{
case 1:sum = 0; break;
case 2:sum = 31; break;
case 3:sum = 59; break;
case 4:sum = 90; break;
case 5:sum = 120; break;
case 6:sum = 151; break;
case 7:sum = 181; break;
case 8:sum = 212; break;
case 9:sum = 243; break;
case 10:sum = 273; break;
case 11:sum = 304; break;
case 12:sum = 334; break;
default:printf("wrong!"); break;
}
sum = sum + day;
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
{
leap = 1;
}
else {
leap = 0;
}
if (leap == 1 && month > 2)
{
sum++;
}
printf("这是一年的第 %d 天.",sum);
printf("\n");
return 0;
}
6,输入一串字符串。要求统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
对于字符串的知识学习的不够深入,所以借鉴了CSDN上的一个答案进行学习。
先小小的总结一下有关于字符串的知识,首先对于含有字符的数组或者变量需要用char来定义,当需要从键盘上输入字符时用到的是gets,gets相当于之前学的scanf。
对于字符变量类型的判断,我用到的是if语句,也是第一次知道可以用大小范围来判断字符变量的类型。
在敲代码过程中发现在for循环中,如果和之前一样写结束条件为i<=100,那么会将未输入的剩余位置都认定为其他字符。查询之后才知道在数组中未输入的位置都是空,即'\0'。所以为了更准确的输出正确字符数,应该将循环结束条件写为a[i]='\0'。这样当循环到输入的最后一个字符时就会停止循环。
#include <stdio.h>
int main()
{
char a[100];
char c;
int i;
int b[5]={0};
gets(a);
for(i=0;a[i]!='\0';i++)
{
c=a[i];
if(c>='a'&&c<='z')
b[0]++;
else if(c>='A'&&c<='Z')
b[1]++;
else if(c>='0'&&c<='9')
b[2]++;
else if(c==' ')
b[3]++;
else b[4]++;
}
printf("小写字母:%d\n",b[0]);
printf("大写字母:%d\n",b[1]);
printf("数字:%d\n",b[2]);
printf("空格:%d\n",b[3]);
printf("其他字符:%d\n",b[4]);
return 0;
}